将 3d 数组中的值分组到关联的 2d 数组中,并使用共享路径对值求和

问题描述 投票:0回答:2

我已经看过了这个 stackoverflow 页面 但这对我没有帮助。

我想按两列分组并对第三列的值求和。

如果

discount_id
dis_percent
相同,则添加
discount_value

这是我的数组:

$dis = [
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '7.500'], ['Dis_val' => '192.75']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '97.88']],
    [['Dis_id' => 'Dl-Dis1'], ['Dis_per' => '5.000'], ['Dis_val' => '39.90']],
    [['Dis_id' => 'Dl-Dis2'], ['Dis_per' => '2.500'], ['Dis_val' => '99.90']]
];

我需要的输出是:

D1-Dis1->7.5->192.75
D1-Dis1->5.0->39.9
D1-Dis2->2.5->197.78

我的代码如下所示:

$newarr = array();
$reverse_map = array();

foreach($dis as $idx => $entry) {
    if (isset($reverse_map[$entry['Dis_id']])) {
         // have we seen this name before? retrieve its original index value
         $idx = $reverse_map[$entry['Dis_id']]; 
    } else {
         // nope, new name, so store its index value
         $reverse_map[$entry['Dis_id']] = $idx;
    }

    // copy the 'constant' values
    $newarr[$idx]['Dis_id'] = $entry['Dis_id'];
    $newarr[$idx]['Dis_per'] = $entry['Dis_per'];

    // sum the qtd_post values to whatever we previously stored.        
    foreach($entry['Dis_val'] as $x => $y) {
        $newarr[$idx]['Dis_val'][$x] += $y;
    }
}
php arrays multidimensional-array sum grouping
2个回答
2
投票

这是我根据您的预期数组结构的理解提出的解决方案;

$dis = array(
    array(
        'Dis_id'  => 'Dl-Dis1',
        'Dis_per' => 7.500,
        'Dis_val' => 192.75
    ),
    ...
);

它通过创建一个多维数组来确定解,其中第一维是

Dis_id
,第二维是
Dis_per
,并且该值成为
Dis_val
的总和;

$sums = array();

foreach ($dis as $entry) {
    if (!isset($sums[$entry['Dis_id']])) {
        $sums[$entry['Dis_id']] = array();
    }
    if (!isset($sums[$entry['Dis_id']]["{$entry['Dis_per']}"])) {
        $sums[$entry['Dis_id']]["{$entry['Dis_per']}"] = 0;
    }
    $sums[$entry['Dis_id']]["{$entry['Dis_per']}"] += $entry['Dis_val'];
}

参见此工作示例; https://eval.in/158661


0
投票

当您迭代输入数组时,使用数组解构来隔离

Dis_id
Dis_per
值,并在存储
Dis_val
时将它们用作键。

如果之前没有遇到过关键路径,则默认存储金额为0,并将当前金额添加到其中。

代码:(演示

$result = [];
foreach ($dis as [['Dis_id' => $id], ['Dis_per' => $per], ['Dis_val' => $val]]) {
    $result[$id][$per] = ($result[$id][$per] ?? 0) + $val;
}
var_export($result);
© www.soinside.com 2019 - 2024. All rights reserved.