PHP中重复键值数组的总和

时间:2017-12-19 07:18:09

标签: php arrays laravel-5.3

我有一个重复键值的数组。如何在另一个新数组中汇总所有重复的数组键值?

 $array = Array (
           "0" => Array ( "2" => 123 ),
           "1" => Array ( "4" => 45 ),
           "2" => Array ( "3" => 12 ),
           "3" => Array ( "5" => 2 ),
           "4" => Array ( "2" => 12 ),
           "5" => Array ( "4" => 21 ),
           "6" => Array ( "2" => 12 ),
           "7" => Array ( "3" => 21 ),
           "8" => Array ( "2" => 12 ),
           "9" => Array ( "3" => 21 ),
           "10" => Array ( "2" => 2 ),
           "11" => Array ( "4" => 2 ),
           "12" => Array ( "2" => 2 ),
           "13" => Array ( "4" => 2 ),
           "14" => Array ( "3" => 12 ),
           "15" => Array ( "4" => 12 ),
           "16" => Array ( "2" => 12 ),
           "17" => Array ( "2" => 12 ),
           "18" => Array ( "4" => 12 ),
           "19" => Array ( "3" => 12 ),
           "20" => Array ( "2" => 15 ),
           "21" => Array ( "4" => 21 ),
   );

输出看起来像

$newArray = Array
  (
    [2] => 202
    [3] => 78
    [4] => 115
    [5] => 2
  )

3 个答案:

答案 0 :(得分:1)

您可以使用array_walk_recursive()

$result = [];

array_walk_recursive($array, function($v, $k) use (&$result) {
    if (!isset($result[$k])) {
        $result[$k] = $v;
    } else {
        $result[$k] += $v;
    }
});

print_r($result);

答案 1 :(得分:1)

您可以使用array_sumarray_column来获取每个的总和。

首先,我们必须获取所有密钥,然后将它们与array_sum和array_column相加。

$arr = Array (
    "0" => Array ( "2" => 123 ),
    "1" => Array ( "4" => 45 ),
    "2" => Array ( "3" => 12 ),
    "3" => Array ( "5" => 2 ),
    "4" => Array ( "2" => 12 ),
    "5" => Array ( "4" => 21 ),
    "6" => Array ( "2" => 12 ),
    "7" => Array ( "3" => 21 ),
    "8" => Array ( "2" => 12 ),
    "9" => Array ( "3" => 21 ),
    "10" => Array ( "2" => 2 ),
    "11" => Array ( "4" => 2 ),
    "12" => Array ( "2" => 2 ),
    "13" => Array ( "4" => 2 ),
    "14" => Array ( "3" => 12 ),
    "15" => Array ( "4" => 12 ),
    "16" => Array ( "2" => 12 ),
    "17" => Array ( "2" => 12 ),
    "18" => Array ( "4" => 12 ),
    "19" => Array ( "3" => 12 ),
    "20" => Array ( "2" => 15 ),
    "21" => Array ( "4" => 21 ),
);

// find all subarray keys (2,3,4,5)
foreach($arr as $subarr){
    $keys[] = key($subarr);
}

// remove duplicate keys
$keys = array_unique($keys);

// sum values with same key from $arr and save to $sums
foreach($keys as $key){
    $sums[$key] = array_sum(array_column($arr,$key));    
}

var_dump($sums);

https://3v4l.org/F3RJr

代码可以缩短为:

foreach($arr as $subarr){
    $key = key($subarr);
    if(!isset($sums[$key])){
        $sums[$key] = array_sum(array_column($arr,$key));        
    }
}
var_dump($sums);

但我不确定它会更快。也许...

答案 2 :(得分:0)

检查以下代码。

$output = array();
$keyarray = array();
foreach($arr as $key => $val){
    if(is_array($val)){
        $key = key($val);
        if(in_array($key,$keyarray)) {
            $output[$key] = $output[$key]+$val[$key];
        } else {
            $keyarray[] = $key;
            $output[$key] = $val[$key];
        }
    }
}

print_r($output);

print_r($output);会为您提供预期的结果。