我已经看过了这个 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;
}
}
这是我根据您的预期数组结构的理解提出的解决方案;
$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
当您迭代输入数组时,使用数组解构来隔离
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);