代码之家  ›  专栏  ›  技术社区  ›  Alex Pliutau

php数组递归和

  •  4
  • Alex Pliutau  · 技术社区  · 14 年前

    我有这样一个数组:

    Array
    (
        [1000] => Array
            (
                [pv] => 36
            )
    
        [1101] => Array
            (
                [1102] => Array
                    (
                        [pv] => 92
                    )
    
                [pv] => 38
            )
    
        [pv] => 64
    )
    

    我怎样才能找到所有数组元素的总和,不管它们出现在什么深度。

    36+92+38+64 = 240

    谢谢你的帮助。

    8 回复  |  直到 14 年前
        1
  •  22
  •   salathe    14 年前

    $sum = 0;
    $array_obj = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    foreach($array_obj as $key => $value) {
        if($key == 'pv')
            $sum += $value;
    }
    echo $sum;
    

    我想我应该提到这个方法使用PHP SPL Iterators.


    选择编辑:

    RegexIterator ,将生成的迭代器转换为数组并使用 array_sum 它的功能。这纯粹是一个学术活动,我当然不会把它作为 最好的

    $sum = array_sum(
        iterator_to_array(
            new RegexIterator(
                new RecursiveIteratorIterator(
                    new RecursiveArrayIterator($array)
                ),
                '/^pv$/D',
                RegexIterator::MATCH,
                RegexIterator::USE_KEY
            ),
            false
        )
    );
    
        2
  •  11
  •   fredley    14 年前
    function addPV($array){
      $sum = 0;
      foreach($array as $key => $a){
        if (is_array($a)){
           $sum += addPV($a);
        }else if($key == 'pv') {
           $sum += $a;
        }
      }
      return $sum;
    }
    
        3
  •  7
  •   Community CDub    8 年前

    基于@Ali Sattari answer

    function sum($v, $w) {
        return $v + (is_array($w) ? 
            array_reduce($w, __FUNCTION__) : $w);
    }
    
        4
  •  4
  •   Ali Sattari    14 年前

    array_reduce array_walk_recursive 函数和自定义回调函数:

    function sum($v, $w)
    {
        $v += $w;
        return $v;
    }
    
    $total = array_reduce($your_array, "sum");
    
        5
  •  1
  •   Mark Baker    14 年前
    $sum = 0;
    
    function sumArray($item, $key, &$sum)
    {
        if ($key == 'pv')
           $sum += $item;
    }
    
    array_walk_recursive($array, 'sumArray',&$sum);
    echo $sum;
    
        6
  •  1
  •   Auirio    14 年前
    $array = array('1000'=> array('pv'=>36), array('1101' => array('pv'=>92)));
    
    $total = 0;
    foreach(new recursiveIteratorIterator( new recursiveArrayIterator($array)) as $sub)
    {
     $total += (int)  $sub;
    }
    print_r($total);
    
        7
  •  1
  •   RobertPitt    14 年前
    function SumRecursiveByKey($array,$key)
    {
        $total = 0;
        foreach($array as $_key => $value)
        {
            if(is_array($value))
            {
                $total += SumRecursiveByKey($array,$key);
            }elseif($_key == $key)
            {
                 $total += $value;
            }
        }
        return $total;
    }
    

    $summed_items = SumRecursiveByKey($myArray,'pv');
    

    这将给你更多的余地,在检查替代钥匙一个膨胀。

        8
  •  -1
  •   Alex Pliutau    14 年前
    private function calculateUserGv($userId) {
        $group = $this->arrayUnder($this->_user_tree, $userId);
        global $gv;
        $gv = 0;
        $gv    = $this->gvRecursive($group);
        return;
    }
    
    private function gvRecursive($group) {
        global $gv;
        foreach ($group as $key => $val) {
            if ($key == 'pv') {
                $gv += $group[$key];
            }
            else {
                $this->gvRecursive($val);
            }
        }
        return $gv;
    }