通过索引键聚合多维数组的优雅方式

时间:2010-05-05 19:04:14

标签: php recursion multidimensional-array hierarchical-data

如何递归查找看起来像这样的数组的所有子项的总值?

 [0] => Array
    (
        [value] => ? // 8590.25 + 200.5 + 22.4
        [children] => Array
            (
                [0] => Array
                    (
                        [value] => ? // 8590.25 + 200.5
                        [children] => Array
                            (
                                [0] => Array
                                    (
                                        [value] => 8590.25 // leaf node
                                    )
                                [1] => Array
                                    (
                                        [value] => 200.05 // leaf node
                                    )
                            )

                    )
                [1] => Array
                    (
                        [value] => 22.4 // leaf node
                    )
             )
    )

2 个答案:

答案 0 :(得分:1)

这是我使用类而不是数组的情况。这样,您可以使用getValue()方法(或使用magic来使用__get定义value属性),它根据需要对子值求和。如果您保证在一个点之后事物不会改变,您可以缓存这些子总和以避免重复计算。也许是这样的?

class DataStructure
{
  private $children = array ();
  private $value = 0;

  public function __construct ($value = 0)
  {
    $this->value = $value;
  }

  public function getValue ()
  {
    $total = $this->value;
    foreach ($this->children as $child)
    {
      $total += $child->getValue ();
    }
    return $total;
  }

  public function addChild (DataStructure $child)
  {
    $this->children[] = $child;
  }
}

答案 1 :(得分:1)

这将为您提供叶节点值的总和:

$sum = 0;
array_walk_recursive($arr, create_function('$v, $k, $sum', '$sum[0] += $v;'), array(&$sum));

等效使用匿名函数(PHP 5.3 +):

$sum = 0;
array_walk_recursive($arr, function ($v) use (&$sum) { $sum += $v; });