Php 如何将数组的相同键与其值相加

Php 如何将数组的相同键与其值相加,php,multidimensional-array,Php,Multidimensional Array,我必须将多维数组的数组键总结为: Array ( [0] => Array ( [qty_of_leads_by_levels] => Array ( [0] => 6054 [1] => 454 [2] => 113 [3] => 85

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

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

这里,我想得到数组键的和,例如,键[qty\u of_leads\u by_Level]的值应该用相同的键和输出数组求和:

 [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

您可以通过循环阵列来执行以下操作:

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

首先将关联数组指定为$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);

您可以使用
array\u walk\u recursive
通过引用传递
和$final
对于每个
递归

$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>';
$final=array();
数组\遍历\递归($数组,函数($item,$key)使用(&$final){
$final[$key]=isset($final[$key])?$item+$final[$key]:$item;
} );
未结算($final['avg_deal_size',$final['total_bgt');
回声';打印(最终版);回声';
请参阅最后的演示输出

输出:

数组
(
[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
)

我用
递归数组迭代器
来维护所有键。请查看以下解决方案:

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

下面使用PHP>4

$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'];
}
输出:


我通过以下方式尝试了这一点:

$qty\u of_leads\u by_levels=array();
$avg_conv_cof_arry=array();
$avg_deal_size=0;
$total_bgt=0;
对于($i=0;$i$v){
$qty\u按级别划分的\u Lead\u[$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'];
}
$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
)
$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'];
}