为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
烙印99 2023-11-03 20:24:18
我写了一个递归函数,它依赖于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()函数处理整组数据,而又不会使函数过于复杂?
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

问题是,正如你所拥有的

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

在整个过程中,这将忽略后续元素中的任何其他项目。

一个快速修复方法是将新值添加到当前值中,并在例程结束时返回 1...

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


查看完整回答
反对 回复 2023-11-03
?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

您需要删除return printAll(...)并将值添加到变量中。否则它将停止在第一个具有'children'


<?php


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

    foreach($a as $v) {

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

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

            //Just remove this return and add to the variable you already have.

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

        }

    }

    return $values;

}


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

var_dump(printAll($a));


查看完整回答
反对 回复 2023-11-03
  • 2 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信