递归函数仅适用于数组的第一层

我写了一个递归函数,它依赖于echo工作,并且它工作得很好。但是,为了挑战自己,我想让它返回一个已处理值的数组,而不是直接回显这些值。


printAll(

    json_decode('[{"id":1,"children":[{"id":2},{"id":5,"children":[{"id":3}]}]},{"id":4}]', true)

);


function printAll($a, $level = '', $values = []) {

    foreach($a as $v) {

        $values[] = $value = "{$level}{$v['id']}";

        if(!empty($v['children'])) {

            return printAll($v['children'], "{$value}.", $values);

        }

    }

    return $values;

}

但我得到了意想不到的结果。该函数当前返回一个如下所示的数组:


Array

(

    [0] => 1

    [1] => 1.2

    [2] => 1.5

    [3] => 1.5.3

)

但在这种情况下,我期待的是:


Array

(

    [0] => 1

    [1] => 1.2

    [2] => 1.5

    [3] => 1.5.3

    [4] => 4

)

看起来我的递归函数只处理 的第一个值及其$data所有子项,但从不处理 的其余部分$data。我假设这是因为我正在使用return它结束循环。


我的问题是,如何让我的printAll()函数处理整组数据,而又不会使函数过于复杂?


烙印99
浏览 111回答 2
2回答

森林海

问题是,正如你所拥有的return printAll($v['children'], "{$value}.", $values);在整个过程中,这将忽略后续元素中的任何其他项目。一个快速修复方法是将新值添加到当前值中,并在例程结束时返回 1...$values += printAll($v['children'], "{$value}.", $values);

慕盖茨4494581

您需要删除return printAll(...)并将值添加到变量中。否则它将停止在第一个具有'children'<?phpfunction printAll($a, $level = '', $values = []) {&nbsp; &nbsp; foreach($a as $v) {&nbsp; &nbsp; &nbsp; &nbsp; $values[] = $value = "{$level}{$v['id']}";&nbsp; &nbsp; &nbsp; &nbsp; if(!empty($v['children'])) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Just remove this return and add to the variable you already have.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $values = printAll($v['children'], "{$value}.", $values);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return $values;}$a = json_decode('[{"id":1,"children":[{"id":2},{"id":5,"children":[{"id":3}]}]},{"id":4}]',true);var_dump(printAll($a));
打开App,查看更多内容
随时随地看视频慕课网APP