如何递归查找看起来像这样的数组的所有子项的总值?
[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
)
)
)
答案 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; });