我有以下数组:
[
['id' => 1, 'uid' => 50, 'sum1' => 1, 'sum2' => 2],
['id' => 2, 'uid' => 50, 'sum1' => 2, 'sum2' => 4],
['id' => 3, 'uid' => 51, 'sum1' => 3, 'sum2' => 5],
]
如您所见,在其中一些索引上,[uid] 是相同的。数组的长度和数据是动态的。
我需要做的是合并具有相同 [uid] 值的索引,并对非识别键的值求和。
想要的结果:
[
['id' => 2, 'uid' => 50, 'sum1' => 3, 'sum2' => 6],
['id' => 3, 'uid' => 51, 'sum1' => 3, 'sum2' => 5],
]
你可以这样做,
<?php
$mainArray = [
0 => Array
(
'id' => 1,
'uid' => 50,
'sum1' => 1,
'sum2' => 2
),
1 => Array
(
'id' => 2,
'uid' => 50,
'sum1' => 2,
'sum2' => 4
),
2 => Array
(
'id' => 3,
'uid' => 51,
'sum1' => 3,
'sum2' => 5
)
];
$newArray=[];
foreach ($mainArray as $value) {
if(!array_key_exists($value['uid'], $newArray)){
// Store first time
$newArray[$value['uid']] = $value;
}else{
// Already exist, then sum and replace it
$newArray[$value['uid']]['id'] = $value['id'];
$newArray[$value['uid']]['sum1'] += $value['sum1'];// Sum with previous value
$newArray[$value['uid']]['sum2'] += $value['sum2'];// Sum with previous value
}
}
$newArray = array_values($newArray);// Reset indexes, Start the array index with zero
print_r($newArray);// To see the output
输出:
Array
(
[0] => Array
(
[id] => 2
[uid] => 50
[sum1] => 3
[sum2] => 6
)
[1] => Array
(
[id] => 3
[uid] => 51
[sum1] => 3
[sum2] => 5
)
)
我认为你是对的。实际上,我使用类似的方法解决了这个问题:
$sumArray = Array();
foreach ($array1 as $item){
if(isset($sumArray[$item['uid']])){
$sumArray[$item['idPartener']]['sum1'] += $item['sum1'];
$sumArray[$item['idPartener']]['sum2'] += $item['sum2'];
}else{
$sumArray[$item['uid']] = Array(
'id' => $item['id'],
'sum1' => $item['sum1'],
'sum2' => $item['sum2'] ,
);
}
}
感谢大家的帮助!
为了避免在分组后需要重新索引数组,请在每次遇到唯一的
uid
值时将引用推入结果数组中。该引用应将整行作为基值。如果再次遇到相同的 uid
,请将 sum1
和 sum2
值添加到参考的相应列值中。
代码:(演示)
$result = [];
foreach ($array as $row) {
if (!isset($ref[$row['uid']])) {
$ref[$row['uid']] = $row;
$result[] =& $ref[$row['uid']];
continue;
}
$ref[$row['uid']]['sum1'] += $row['sum1'];
$ref[$row['uid']]['sum2'] += $row['sum2'];
}
var_export($result);