【问题标题】:Sum of duplicate key values array in PHPPHP中重复键值数组的总和
【发布时间】:2018-06-01 13:58:21
【问题描述】:

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

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

【问题讨论】:

标签: php arrays laravel-5.3


【解决方案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】:

    检查下面的代码。

    $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); 会给你预期的结果。

    【讨论】:

      【解决方案3】:

      您可以使用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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-16
        • 2019-08-28
        • 2013-02-04
        • 1970-01-01
        • 2011-09-04
        • 1970-01-01
        相关资源
        最近更新 更多