递归函数计算总计从下至上的数组



我有一个像这样的数组:

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值为:

  • Books = 11
  • Jeffrey Archer = 8
  • Thriller = 5

最好不使用SPL函数(但如果没有其他方法,请随意)。

任何想法?

这是未经测试的,但应该可以达到目的

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

代码:(带有扩展样本数据的演示)

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);
*/

最新更新