Dizin anahtarı ile çok boyutlu bir dizi toplamak için şık bir yol

2 Cevap php

Nasıl yinelemeli şöyle bir dizinin tüm çocukların toplam değerini bulabilirim?

 [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 Cevap

Bu benim bir dizi yerine bir sınıf kullanmak istiyorum dava türüdür. Bu şekilde, bir getValue () yöntemi var (veya __ get kullanarak değer özellik tanımlamak için büyü kullanın), bu talep üzerine çocuk değerlerini toplar. Bir şeyler bir noktadan sonra değişiklik olmayacağını garanti varsa, repetetive hesaplamaları önlemek için bu çocuk meblağlar önbelleğe alabilir. Belki böyle bir şey?

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

Bu size yaprak düğüm değerlerinin toplamını verecektir:

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

Eşdeğer anonim fonksiyonları (PHP 5.3 +) kullanılarak:

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