2011-07-07 83 views
0

我有一个数组,看起来像这样:递归函数来计算从底向上总计在阵列

Array 
(
    [0] => Array 
     (
      [id] => 5 
      [title] => Books 
      [total_links] => 3 
      [subcategories] => Array 
       (
        [0] => Array 
         (
          [id] => 6 
          [title] => Jeffrey Archer 
          [total_links] => 1 
          [subcategories] => Array 
           (
            [0] => Array 
             (
              [id] => 8 
              [title] => Political 
              [total_links] => 2 
              [subcategories] => Array 
               (
               ) 

             ) 

            [1] => Array 
             (
              [id] => 9 
              [title] => Thriller 
              [total_links] => 5 
              [subcategories] => Array 
               (
               ) 

             ) 

           ) 

         ) 

我需要一个递归函数,将遍历subcategories从底部向上,加入total_links在一起并改变在它上面的数组中的total_links的值。

所以最终的阵列将具有total_links值:

  • 图书= 11
  • 杰弗里射手= 8
  • 政治= 2
  • 惊悚= 5

并且最好不使用SPL功能(但如果没有其他方式,则可以免费使用)。

任何想法?

+0

你尝试过什么到目前为止? –

+0

我无法理解您的数据结构的逻辑。 “Books”中的“total_links”*与子数组中的'total_links'分开吗? –

+0

是完全分开的 – fire

回答

1

这是未经测试,但应该做的伎俩

function do_sums(&$array) { 
    if (is_array($array['subcategories'])) { 
     foreach ($array['subcategories'] as $category_array) { 
      $array['total_links'] += do_sums($category_array); // recurse down first 
     } 
    } 
    return($array['total_links']); 
} 

$your_array = array(...) 

do_sums($your_array); 
+0

不太合适,还有多个父母 – fire

0

代码:(Demo with extended sample data for testing

function sum_links(&$array){ // make $array modifiable by reference 
    foreach($array as &$item){ // make $item modifiable by reference 
     if(!empty($item['subcategories'])){ // only recurse if there are children in subcategories 
      $item['total_links']+=array_sum(array_column(sum_links($item['subcategories']),'total_links')); 
      // recursion returns full subarray, extract desired column data, add sum to the original value 
     } 
    } 
    return $array; // return the full & updated array 
} 

var_export(sum_links($array)); 

/* or because $array is modified by reference... 
    sum_links($array); 
    var_export($array); 
*/