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

时间:2011-06-21 10:40:01

标签: php recursion

我有一个这样的数组:

$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)等调用函数不同。

3 个答案:

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