我写了一个递归函数,它依赖于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);
慕盖茨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));
- 2 回答
- 0 关注
- 118 浏览
添加回答
举报
0/150
提交
取消