参数数量可变的递归函数-如何传递左参数


recursive function with variable number of arguments - how to pass left arguments?

我有一个这样的数组:

$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)调用函数与用(array 1,array2,array3)等调用函数不同。

只做(演示)有什么问题

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

或者-由于三元运算(演示),可读性稍差:

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

如果您将找到的参数的前两个条目分开;可以在带有以下函数的调用中使用结果数组:call_user_func_array

对于其他谷歌人来说,以下是原始问题的答案

假设我们有一个将两个数组相加的函数:

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