我需要获取深度未定义的数组的值

时间:2018-12-05 16:57:08

标签: php arrays recursion

我有一个数组,其中的孩子可以无限期地有更多的孩子,依此类推。我需要获得所有父母和孩子的身份证。

我尝试使用一个调用自身的函数遍历数组,但是它不起作用。我试过:(初始树是前面提到的数组)

public function recursiveTree($tree,$data = NULL){
  $data[] = $tree['id'];
  if($tree['children']){
      foreach ($tree['children'] as $key => $treeChildMin){
        return $this->recursiveTree($treeChildMin,$data);
      }
    }else{
      return $data;
    }
  }

它返回array { [0]=> int(3) [1]=> int(4) [2]=> int(5) }

一个示例输入数组如下。在该示例中,我想要一个具有所有ID的数组,例如$values = [3,4,5,7,8,9,10,11];

`array(5) {
    ["id"]=>
    int(3)
    ["children"]=>
    array(2) {
        [0]=>
        array(5) {
            ["id"]=>
            int(4)
            ["children"]=>
            array(2) {
                [0]=>
                array(5) {
                    ["id"]=>
                    int(5)
                    ["children"]=>
                    array(0) {
                    }
                }
                [1]=>
                array(5) {
                    ["id"]=>
                    int(7)
                    ["children"]=>
                    array(0) {
                    }
                }
            }
        }
        [1]=>
        array(5) {
            ["id"]=>
            int(8)
            ["children"]=>
            array(3) {
                [0]=>
                array(5) {
                    ["id"]=>
                    int(9)
                    ["children"]=>
                    array(0) {
                    }
                }
                [1]=>
                array(5) {
                    ["id"]=>
                    int(10)
                    ["children"]=>
                    array(0) {
                    }
                }
                [2]=>
                array(5) {
                    ["id"]=>
                    int(11)
                    ["children"]=>
                    array(0) {
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

代码问题:

  1. 您在foreach循环中返回,因此它只会执行一次。
  2. 结构略有不一致,因为外部数组有一个id,但是它是一个子数组,所有“ children”数组都没有id。

因此,您仅需要添加ID(如果存在),而不是在循环内返回,而是将每个子ID都添加到数组中,然后将所有ID合并为返回值。

function get_all_ids($array) {

    // add id conditionally
    $ids = isset($array['id']) ? [[$array['id']]] : [];

    // accumulate ids from all children recursively
    // note that you don't need an if here. If children is empty the loop won't execute
    foreach ($array['children'] as $child) {
        $ids[] = get_all_ids($child);
    }

    // return merged results
    return array_merge(...$ids);
}