代码之家  ›  专栏  ›  技术社区  ›  Stephen Fuhry Bobby

用索引键聚合多维数组的优雅方法

  •  0
  • Stephen Fuhry Bobby  · 技术社区  · 14 年前

    如何递归地查找类似这样的数组的所有子级的总值?

     [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 回复  |  直到 14 年前
        1
  •  1
  •   grossvogel    14 年前

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

    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;
      }
    }
    
        2
  •  1
  •   nuqqsa    14 年前

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

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