【问题标题】:How to sum the 2nd level values of a 2-dim array based on the 2nd level keys?如何根据第二级键对 2-dim 数组的第二级值求和?
【发布时间】:2015-04-28 12:18:32
【问题描述】:

我有一个这样的多维数组:

array(
      0 => array(
         11 => 18.000,
         14 => 25.100,
         15 => 5.000,
         16 => 8.000,
         19 => 21.600'
     ),
     1 => array(
         11 => 9.100,
         12 => 2.700,
         14 => 2.300,
         15 => 18.800,
         16 => 9.500,
         17 => 6.900,
         19 => 9.400'
    ),
    2 => array(
        14 => 5.700
    ),
    3 => array(
       17 => 2.800,
       20 => 6.000
   ),
   4 => array(
       24 => 5.000,
       25 => 6.000,
       26 => 2.7
   ),
   5 => array(
       16 => 2.200
   ),
   6 => array(
      14 => 13.000,
      15 => 2.000,
      16 => 4.300,
      19 => 6.000
  ),
  7 => array(
      32 => 5.000,
      36 => 18.500
  )
 )

二级数组有不同的长度。但我想获取具有相似键的元素的值并将它们加在一起以获得总计。

例如,如果数组被称为$multi_dime。我想得到$multi_dime[0][11] 将它添加到$multi_dime[1][11] 等等。

如果键不存在于后面的数组中。它应该只添加0 或忽略它。代码应继续对二级数组中的所有键执行此操作,并将结果存储在另一个数组中,例如:

array(  11 => 27.1,  14 => 46.1, ...)

我怎样才能做到这一点?数组总是二维的,但可以是任意长度,二级数组也可以是任意长度。

【问题讨论】:

    标签: php multidimensional-array array-key array-column array-sum


    【解决方案1】:

    只需使用 foreach 或 for 循环。这就是您使用数组的方式,无论是一维、二维、三维、四维还是两百维。由于您将有多个总和,因此将总和变量设为数组。在循环之外声明它,因为循环完成后您将需要它。

    $sums = array();
    foreach($multi_dime as $vals)
    {
        foreach($vals as $key=>$val)
        {
            // Now we are looping through all values in the second dimension.
            // If the key is not in the sums array, make it.
            if(!isset($sums[$key])) $sums[$key]=0;
            // We add this sum to the key now.
            $sums[$key]+= $val;
        }
    }
    ksort($sums); // Just in case you want the keys in order.
    print_r($sums); // See all the sums.
    

    【讨论】:

      【解决方案2】:

      这是一种效率较低(我假设)的方法,用于计算所有特定于键的列的总和。唯一的区别是我的方法中没有迭代条件,但它确实调用了“更重”的函数。

      代码:(Demo)

      $result=[];
      foreach($array as $subarray){
          $subarray=array_diff_key($subarray,$result);  // deny iteration of previously summed subarray keys
          foreach($subarray as $k=>$v){
              $result[$k]=array_sum(array_column($array,$k));  // sum the whole array's column
          }
      }
      var_export($result);
      

      如果这是我的项目,我会编写与 kainaw 非常相似的代码(但不完全一样)。我不喜欢将初始值声明为0,然后在同一迭代中添加到0——这是不必要的双重处理。

      代码:(Demo)

      foreach($array as $subarray){
          foreach($subarray as $k=>$v){
              if(!isset($result[$k])){
                  $result[$k]=$v;
              }else{
                  $result[$k]+=$v;
              }
          }
      }
      var_export($result);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 1970-01-01
        • 2023-01-07
        • 1970-01-01
        • 2021-06-30
        • 2018-08-28
        • 1970-01-01
        相关资源
        最近更新 更多