将二维数组中的行数据按一列进行分组,并分别对每组中的其他 2 列进行求和

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

我有以下数组:

[ 
    ['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 arrays multidimensional-array sum grouping
3个回答
1
投票

你可以这样做,

<?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
        )
)


0
投票

我认为你是对的。实际上,我使用类似的方法解决了这个问题:

$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'] ,
          );
        }

    }

感谢大家的帮助!


0
投票

为了避免在分组后需要重新索引数组,请在每次遇到唯一的

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);
© www.soinside.com 2019 - 2024. All rights reserved.