2011-06-21 157 views
1

我有一个数组是这样的:具有可变数量参数的递归函数 - 如何传递左参数?

$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个以上的数组进行调用时。我试图通过递归做到这一点:

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

这个问题似乎是,这与调用该函数(数组1,arglist中)是不一样的调用与(数组1,数组2,ARRAY3)等

功能
+0

你为什么不能声明功能'array_merge_elements一组阵列($数组1,$数组2)'? – k102

+0

我可以,但我想能够说array_merge_elements($ array1,$ array2,$ array3)以及。 – Riesling

回答

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

或 - 由于三元操作(​​)稍差可读:

$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。我认为这是跛脚,因为它没有递归;) – back2dos

+0

递归不是解决问题的方法。顺便说一句,if ... else ...构造是多余的 - 只需使用'$ months ['all'] [$ letter] + = $ value;'就足够了(虽然它会产生警告) – symcbean

+0

@symcbean递归迭代器对这个问题很好。另外,如果+ =代码提出Notices(它会这样做),那么检查该条件并不是多余的。 – Gordon

1

如果您将分隔您找到的参数的前两个条目;您可以在通话中使用结果数组使用此项功能:Call_user_func_array

0

同胞的Google在那里,这里的答案问题

假设我们有一个功能,增加了两个数组在一起:

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()); 
相关问题