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'];
}