我有一个这样的数组:
$months = Array (
"may" =>
Array (
"A" => 101,
"B" => 33,
"C" => 25
),
"june" =>
Array (
"A" => 73,
"B" => 11,
"D" => 32
),
"july" =>
Array (
"A" => 45,
"C" => 12
)
);
我想得到一个这样的数组:
Array ( ['all'] =>
Array (
[A] => 219
[B] => 44
[C] => 37
[D] => 32
)
)
我写了一个带有2个参数的函数(要连接的两个数组)并且它有效,但是当我尝试使用2个以上的数组调用它时,我失败了。我试图通过递归来做到这一点:
function array_merge_elements(){
$arg_list = func_get_args();
$array1 = $arg_list[0];
$array2 = $arg_list[1];
$keys = array_unique(array_merge(array_keys($array1), array_keys($array2)));
$result_array = array();
foreach($keys as $key) {
$result_array["$key"] = 0;
if(!empty($array1[$key])) {
$result_array["$key"] += $array1[$key];
}
if(!empty($array2[$key])) {
$result_array["$key"] += $array2[$key];
}
}
if(func_num_args() == 2) {
return $result_array;
} else {
unset($arg_list[0]);
unset($arg_list[1]);
return array_merge_elements($result_array, $arg_list);
}
}
问题似乎是,使用(array1,arglist)调用函数与使用(array1,array2,array3)等调用函数不同。
答案 0 :(得分:3)
刚做(demo)
出了什么问题foreach ($months as $month) {
foreach ($month as $letter => $value) {
if (isset($months['all'][$letter])) {
$months['all'][$letter] += $value;
} else {
$months['all'][$letter] = $value;
}
}
}
print_r($months['all']);
或 - 由于三元操作(demo)而导致可读性稍差:
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($months));
foreach ($iterator as $letter => $value) {
isset($months['all'][$letter])
? $months['all'][$letter] += $value
: $months['all'][$letter] = $value;
}
print_r($months['all']);
答案 1 :(得分:1)
如果您拆分了找到的参数的前两个条目;您可以使用此函数在调用中使用结果数组:Call_user_func_array
答案 2 :(得分:0)
对于其他的googlers,这里是原始问题的答案
假设我们有一个将两个数组加在一起的函数:
function array_plus($a, $b) {
foreach($b as $k => $v)
$a[$k] = (isset($a[$k]) ? $a[$k] : 0) + $v;
return $a;
}
这是如何将此函数应用于一组数组
$sum = array_reduce($months, 'array_plus', array());