【问题标题】:How to sum of same keys of arrays with their values如何将数组的相同键与其值相加
【发布时间】:2016-06-06 12:02:19
【问题描述】:

我必须将多维数组的数组键总结为:

     Array
  (
  [0] => Array
    (
        [qty_of_leads_by_levels] => Array
            (
                [0] => 6054
                [1] => 454
                [2] => 113
                [3] => 85
                [4] => 42
                [5] => 21
                [6] => 5
                [7] => 1
                [8] => 1
            )

        [avg_conv_cof_arry] => Array
            (
                [0] => 0.08
                [1] => 0.1
                [2] => 0.34
                [3] => 0.25
                [4] => 0.28
                [5] => 0.15
                [6] => 0.16
                [7] => 0.49
                [8] => 0.52
            )

        [avg_deal_size] => 54545
        [total_bgt] => 143763
    )

[1] => Array
    (
        [qty_of_leads_by_levels] => Array
            (
                [0] => 11393
                [1] => 8144
                [2] => 6490
                [3] => 4868
                [4] => 2434
                [5] => 1217
                [6] => 305
                [7] => 76
                [8] => 57
            )

        [avg_conv_cof_arry] => Array
            (
                [0] => 0.41
                [1] => 0.42
                [2] => 0.68
                [3] => 0.5
                [4] => 0.55
                [5] => 0.3
                [6] => 0.31
                [7] => 0.98
                [8] => 1.01
            )

        [avg_deal_size] => 54545
        [total_bgt] => 297490245
    )

[2] => Array
    (
        [qty_of_leads_by_levels] => Array
            (
                [0] => 366
                [1] => 366
                [2] => 366
                [3] => 366
                [4] => 366
                [5] => 184
                [6] => 46
                [7] => 11
                [8] => 9
            )

        [avg_conv_cof_arry] => Array
            (
                [0] => 1
                [1] => 1
                [2] => 1
                [3] => 1
                [4] => 0.5
                [5] => 0.25
                [6] => 0.25
                [7] => 0.75
                [8] => 0.75
            )

        [avg_deal_size] => 54545     

        [total_bgt] => 1981167       
    )

)

在这里,我想得到数组键的总和,例如,键 [qty_of_leads_by_levels] 的值应该用相同的键和输出数组求和:

 [qty_of_leads_by_levels] => Array
    (
        [0] => 17814.49                   //sum
        [1] => 8965.52
        [2] => 6971.02
        [3] => 5320.75
        [4] => 2843.33
        [5] => 1422.7
        [6] => 356.72
        [7] => 90.22
        [8] => 69.28
    )      

 [avg_conv_cof_arry] => Array
            (
                [0] =>                 //sum
                [1] =>
                [2] => 
                [3] => 
                [4] => 
                [5] => 
                [6] => 
                [7] => 
                [8] =>
            )

      [avg_deal_size] =>                //sum

      [total_bgt] =>                    //sum

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    首先将您的关联数组分配给 $inputArray。

    $sumArr = array();
        foreach($inputArray as $key1=>$value1){
        foreach($value1 as $key2=>$value2){
        if(is_array($value2)){
        foreach($value2 as $key3=>$value3){
            if(isset($sumArr[$key3])) {
                     $sumArr[$key3] = $sumArr[$key3] + $value3;
                 } else {
                     $sumArr[$key3] = $value3;
                 }
    
        }
        }
        }
        }
    
       print_r($sumArr);
    

    【讨论】:

      【解决方案2】:

      你可以通过循环数组来做到:

      $qty_of_leads_by_levels = array();
      foreach ($your_arr as $key_internal=>$arr_internal){
          foreach ($arr_internalas $key_internal_2=>$value_internal_2){
              foreach ($value_internal_2 as $key=>$value){
                   if(isset($qty_of_leads_by_levels[$key])) {
                       $qty_of_leads_by_levels[$key] = $qty_of_leads_by_levels[$key] + $value
                   } else {
                       $qty_of_leads_by_levels[$key] = $value;
                   }
              }
         }
      }
      
      print_r($qty_of_leads_by_levels);
      

      【讨论】:

        【解决方案3】:

        您可以通过使用array_walk_recursive 使用传递引用&$final 来做到这一点 对于每个item 递归。

        $final = array();
        
        array_walk_recursive( $array, function ( $item, $key ) use ( &$final ) {
            $final[ $key ] = isset( $final[ $key ] ) ? $item + $final[ $key ] : $item;
        } );
        unset( $final['avg_deal_size'], $final['total_bgt'] );
        
        echo '<pre>';print_r($final);echo '</pre>';
        

        见最后的Demo输出here

        输出:

        <pre>Array
        (
            [0] => 17814.49
            [1] => 8965.52
            [2] => 6971.02
            [3] => 5320.75
            [4] => 2843.33
            [5] => 1422.7
            [6] => 356.72
            [7] => 90.22
            [8] => 69.28
        )
        </pre>
        

        【讨论】:

          【解决方案4】:

          我尝试使用RecursiveArrayIterator 来维护所有密钥。看看下面的解决方案:

          $array = array
          (
              array
              (
                  'qty_of_leads_by_levels' => array
                  (
                      0 => 6054,
                      1 => 454,
          
                  ),
          
                  'avg_conv_cof_arry' => array
                  (
                      0 => 0.08,
                      1 => 0.1
          
                  ),
          
                  'avg_deal_size' => 1,
                  'total_bgt' => 1
              ),
          
              array
              (
                  'qty_of_leads_by_levels' => array
                  (
                      0 => 11393,
                      1 => 8144,
          
                  ),
          
                  'avg_conv_cof_arry' => array
                  (
                      0 => 0.41,
                      1 => 0.42
          
                  ),
          
                  'avg_deal_size' => 2,
                  'total_bgt' => 2
              ),
          
              array
              (
                  'qty_of_leads_by_levels' => array
                  (
                      0 => 366,
                      1 => 366
          
                  ),
          
                  'avg_conv_cof_arry' => array
                  (
                      0 => 1,
                      1 => 1
          
                  ),
          
                  'avg_deal_size' => 3,
                  'total_bgt' => 3
              )
          );
          
          $new_array = array();
          $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
          
          foreach ($iterator as $key => $value) {
              $keys = array();
              $keys[] = $key;
              for ($i = $iterator->getDepth() - 1; $i >= 0; $i--) {
                  $keys[] = $iterator->getSubIterator($i)->key();
              }
          
              //get key path
              $key_paths = array_reverse($keys);
          
              if((count($key_paths) > 2)) {
                  if(!isset($new_array[$key_paths[1]][$key])){
                      $new_array[$key_paths[1]][$key] = 0;
                  }
                  $new_array[$key_paths[1]][$key] += $value;
              }
              else {
                  if(!isset($new_array[$key_paths[1]])){
                      $new_array[$key_paths[1]] = 0;
                  }
                  $new_array[$key_paths[1]] += $value;
              }
          }
          
          print_r($new_array);
          

          输出

          Array
          (
              [qty_of_leads_by_levels] => Array
                  (
                      [0] => 17813
                      [1] => 8964
                  )
          
              [avg_conv_cof_arry] => Array
                  (
                      [0] => 1.49
                      [1] => 1.52
                  )
          
              [avg_deal_size] => 6
              [total_bgt] => 6
          )
          

          【讨论】:

            【解决方案5】:
            <?php
            $sumArray = [];
            foreach($array as $r) 
                for($i = 0; $i < count($r); $i++)
                    $sumArray[$i] += $r['qty_of_leads_by_levels'][$i];
            ?>
            

            【讨论】:

              【解决方案6】:

              以下适用于 PHP >4

              $arr = array_column($input, 'qty_of_leads_by_levels');
              
              $sumArray = array();
              array_walk($arr, function ($val, $key) use ($sumArray){
                  foreach($val as $k => $v) {
                      $sumArray[$k] = isset($sumArray[$k]) ? $sumArray[$k]+$v : $v;
                  }
              });
              
              print_r($sumArray);
              

              输出:

              Array
              (
                  [0] => 17814.49
                  [1] => 8965.52
                  [2] => 6971.02
                  [3] => 5320.75
                  [4] => 2843.33
                  [5] => 1422.7
                  [6] => 356.72
                  [7] => 90.22
                  [8] => 69.28
              )
              

              【讨论】:

                【解决方案7】:

                我通过以下方式进行了尝试:

                $qty_of_leads_by_levels = array();
                $avg_conv_cof_arry = array();
                $avg_deal_size = 0;
                $total_bgt = 0;
                
                
                for($i=0;$i<count($arr1);$i++){
                
                    foreach($arr1[$i]['qty_of_leads_by_levels'] as $k=>$v){
                        $qty_of_leads_by_levels[$k] += $v;  
                    }
                
                    foreach($arr1[$i]['avg_conv_cof_arry'] as $k1=>$v1){
                        $avg_conv_cof_arry[$k1] = $avg_conv_cof_arry[$k1] + $v1;
                    }
                
                    $avg_deal_size += $arr1[$i]['avg_deal_size'];
                    $total_bgt += $arr1[$i]['total_bgt'];
                }
                

                【讨论】:

                  猜你喜欢
                  • 2013-02-01
                  • 1970-01-01
                  • 2012-10-03
                  • 1970-01-01
                  • 2014-03-06
                  • 2021-06-18
                  • 2019-05-07
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多