【问题标题】:How to count multidimensional array values?如何计算多维数组值?
【发布时间】:2012-06-26 04:41:42
【问题描述】:

我正在用PHP构建一个传销软件,它的一个功能是统计下线表现。 它从父子关系创建一个数组,如下所示。 我如何才能通过第五层获得我的孩子和他们的孙子的表现(数组键:积分)?

    Array
(
    [children] => Array
        (
            [0] => Array
                (
                    [id] => 1
                    [name] => Medvedev
                    [email] => 
                    [points] => 7
                    [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 3
                                    [name] => Putin
                                    [email] => 
                                    [points] => 4
                                    [children] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [id] => 5
                                                    [name] => Nathan
                                                    [email] => 
                                                    [points] => 3
                                                )

                                            [1] => Array
                                                (
                                                    [id] => 7
                                                    [name] => George
                                                    [email] => 
                                                    [points] => 666
                                                )

                                        )

                                )

                            [1] => Array
                                (
                                    [id] => 4
                                    [name] => Lucas
                                    [email] => 
                                    [points] => 43
                                )

                        )

                )
        )

    [id] => 27
    [name] => Boss
    [email] => 
    [points] => 99999
)

【问题讨论】:

    标签: php arrays recursion multidimensional-array


    【解决方案1】:

    这应该从像这样的主数组开始无限深度地工作

    $array = array(
        'children' => array( /* ADD HERE INFINITE COMBINATION OF CHILDREN ARRAY */ ),
        'id' => #,
        'name' => '',
        'email' => '',
        'points' => #
    );
    
    function recursive_children_points($arr) {
        global $hold_points;
        if (isset($arr['points'])) {
            $hold_points[] = $arr['points'];
        }
        if (isset($arr['children'])) {
            foreach ($arr['children'] as $children => $child) {
                recursive_children_points($child);
            }
        }
        return $hold_points;
    }
    
    $points = recursive_children_points($array);
    print "<pre>";
    print_r($points);
    /**
         // OUTPUT
         Array
    (
        [0] => 99999
        [1] => 7
        [2] => 4
        [3] => 3
        [4] => 666
        [5] => 43
    )
    **/
        print "<pre>";
    

    【讨论】:

      【解决方案2】:

      在我看来,这需要recursion,因为您将对数组的每个平面级别执行相同的操作:添加点。

      所以你需要

      • 循环遍历每个数组
      • 添加点发现
      • 如果我们找到任何孩子,请再做一次,但要使用孩子数组

      同时跟踪关卡并在达到极限时跳出

      考虑到这一点,我想到了以下解决方案:

      <?php
      
      $values = array();
      
      //first
      $values[] = array('name'=>'andrej','points'=>1,'children'=>array());
      $values[] = array('name'=>'peter','points'=>2,'children'=>array());
      $values[] = array('name'=>'mark','points'=>3,'children'=>array());
      
      //second
      $values[0]['children'][] = array('name'=>'Sarah','points'=>4,'children'=>array());
      $values[2]['children'][] = array('name'=>'Mike','points'=>5,'children'=>array());
      
      //third 
      $values[0]['children'][0]['children'][] = array('name'=>'Ron','points'=>6,'children'=>array());
      
      //fourth
      $values[0]['children'][0]['children'][0]['children'][] = array('name'=>'Ronny','points'=>7,'children'=>array());
      
      //fifth
      $values[0]['children'][0]['children'][0]['children'][0]['children'][] = array('name'=>'Marina','points'=>10,'children'=>array());
      
      //sixth
      $values[0]['children'][0]['children'][0]['children'][0]['children'][0]['children'][] = array('name'=>'Pjotr','points'=>400,'children'=>array());
      
      
      function collect_elements($base, $maxLevel,$child='children',$gather='points', &$catch = array(), $level = 0) {
      /*    I pass $catch by reference so that all recursive calls add to the same array
            obviously you could use it straight away but I return the created array as well
        because I find it to be cleaner in PHP (by reference is rare and can lead to confusion)
      
        $base = array it works on
        $maxLevel = how deep the recursion goes
      
        $child = key of the element where you hold your possible childnodes
            $gather = key of the element that has to be collected
      */
      
        $level++;
        if($level > $maxLevel) return; // we're too deep, bail out
      
        foreach ($base as $key => $elem) {
          // collect the element if available
          if(isset($elem[$gather])) $catch[] = $elem[$gather];
      
          /*
          does this element's container have children? 
             [$child] needs to be set, [$child] needs to be an array, [$child] needs to have elements itself
          */
          if (isset($elem[$child]) && is_array($elem[$child]) && count($elem[$child])){
             // if we can find another array 1 level down, recurse that as well  
             collect_elements($elem[$child],$maxLevel,$child,$gather, $catch,$level); 
          }
        }
      return $catch;
      }
      
      print array_sum(collect_elements($values,5)) . PHP_EOL;
      

      collect_elements 将收集您感兴趣的元素(直到达到最大深度)并将其附加到平面数组,以便您可以在返回时对其进行操作。在这种情况下,我们执行array_sum 来获取收集到的总点数

      只有第一个参数是有趣的:

      collect_elements($base, $maxLevel,$child='children',$gather='points'
      

      非可选: $base 是要处理的数组 $maxLevel 是函数需要下降到数组中的最大深度 可选的: $child 定义包含当前元素(数组)的子元素的元素的键 $gather 定义了包含我们要收集的内容的元素的键

      其余参数只是用于递归的参数

      【讨论】:

      • 不知道最高级别会怎样?
      猜你喜欢
      • 2014-10-03
      • 2021-12-10
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多