我有一个多维数组,格式如下:
array (
0 =>
array (
'manual' => 1,
'cancelled' => 1,
'expired' => 1,
'earned' => 1,
'user' =>
array (
'user1' => 1,
'user2' => 1,
'user3' => 1,
'user4' => 1,
),
'transfer' =>
array (
'transfer1' =>
array (
'key1' => 1,
'key2' => 1,
'key3' => 1,
),
'transfer2' =>
array (
'key5' => 1,
'key6' => 1,
'key7' => 1,
),
),
'date' => '2018-03-07',
),
1 =>
array (
'manual' => 1,
'cancelled' => 1,
'expired' => 1,
'earned' => 1,
'user' =>
array (
'user1' => 1,
'user2' => 1,
'user3' => 1,
'user4' => 1,
),
'transfer' =>
array (
'transfer1' =>
array (
'key1' => 1,
'key2' => 1,
'key3' => 1,
),
'transfer2' =>
array (
'key5' => 1,
'key6' => 1,
'key7' => 1,
),
),
'date' => '2018-03-08',
),
)我需要用相同的索引计算数组值的总和。所以总数组应如下所示
Array
(
[total] => Array
(
[manual] => 2
[cancelled] => 2
[expired] => 2
[earned] => 2
[user] => Array
(
[user1] => 2
[user2] => 2
[user3] => 2
[user4] => 2
)
[transfer] => Array
(
[transfer1] => Array
(
[key1] => 2
[key2] => 2
[key3] => 2
)
[transfer2] => Array
(
[key5] => 2
[key6] => 2
[key7] => 2
)
)
即除日期外,总数应具有相同的格式,但需要显示该值的总和。如何在PHP中完成?我使用了以下代码
$final = array_shift($input);
foreach ($final as $key => &$value){
$value += array_sum(array_column($input, $key));
}
unset($value);
var_dump($final);
其中$input
被视为第一个数组,$final
是总数。我认为这只适用于单个索引。
答案 0 :(得分:3)
你可以使用递归功能,遍历你所有的"树"。
有
如果element是数组,则在结果数组中创建相同的数据并为每个键运行函数。 如果它有一个数字,只需为结果添加值。
这是一个样本
<?php
// Array with data
$arr=array(array('manual'=>1,'cancelled'=>1,'expired'=>1,'earned'=>1,'user'=>array('user1'=>1,'user2'=>1,'user3'=>1,'user4'=>1,),'transfer'=>array('transfer1'=>array('key1'=>1,'key2'=>1,'key3'=>1,),'transfer2'=>array('key5'=>1,'key6'=>1,'key7'=>1,)),'date'=>'2018-03-07',),array('manual'=>1,'cancelled'=>1,'expired'=>1,'earned'=>1,'user'=>array('user1'=>1,'user2'=>1,'user3'=>1,'user4'=>1,),'transfer'=>array('transfer1'=>array('key1'=>2,'key2'=>2,'key3'=>2,),'transfer2'=>array('key5'=>2,'key6'=>2,'key7'=>2,)),'date'=>'2018-03-08',));
//Init result array
$res=array('total'=>array());
foreach ($arr as $key=>$val) {
//Run it for each element and store result to $res['total']
countTotal($res['total'],$val);
}
//Show result
print_r($res);
/*
* Count totals for branch of array
* @param $res - reference to branch of result array
* @param $arr - branch of data array
*/
function countTotal(&$res,$arr) {
foreach ($arr as $key=>$val) {
if (is_array($val)) {
//it's array. Create "branch" in $res and run countTotal() to calc total for it
if (!isset($res[$key])) $res[$key]=array();
countTotal($res[$key],$val);
} else if (is_numeric($val)) {
// it's number. Create "leaf" if need and add value.
if (!isset($res[$key])) $res[$key]=0;
$res[$key]+=$val;
}
}
}
如您所见,它使用对结果数组的分支的引用来累积总数
结果
Array
(
[total] => Array
(
[manual] => 2
[cancelled] => 2
[expired] => 2
[earned] => 2
[user] => Array
(
[user1] => 2
[user2] => 2
[user3] => 2
[user4] => 2
)
[transfer] => Array
(
[transfer1] => Array
(
[key1] => 3
[key2] => 3
[key3] => 3
)
[transfer2] => Array
(
[key5] => 3
[key6] => 3
[key7] => 3
)
)
)
)
在第二次&#34;转移&#34;我用过&#34; 2&#34;所以&#34; 3&#34;总之
答案 1 :(得分:1)
您可以编写如下的递归函数:
function array_sum_recursive_assoc($array, &$result = [])
{
$keys = array_keys($array[0] ?? []);
foreach ($keys as $key) {
foreach (($column = array_column($array, $key)) as $value) {
if (is_array($value)) {
$result[$key] = [];
array_sum_recursive_assoc($column, $result[$key]);
continue 2;
}
// In this case date safe guard.
if (!is_numeric($value)) {
continue;
}
$result[$key] = ($result[$key] ?? 0) + $value;
}
}
return $result;
}
var_dump(array_sum_recursive_assoc($array));
这是the demo。