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

Php 递归函数仅适用于数组的第一级,php,recursion,Php,Recursion,我编写了一个递归函数,它依赖于echo来工作,并且工作得非常好。但是,为了挑战我自己,我想让它返回一个经过处理的值数组,而不是直接回显这些值 printAll( json_decode('[{"id":1,"children":[{"id":2},{"id":5,"children":[{"id":3}]}]},{"id":4}]', true) )

我编写了一个递归函数,它依赖于
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()
函数处理整个数据集,而不使函数过于复杂?

问题在于

return printAll($v['children'], "{$value}.", $values);
在部分过程中,这将忽略后续元素中的任何其他项

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

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

问题是,正如你所做的那样

return printAll($v['children'], "{$value}.", $values);
在部分过程中,这将忽略后续元素中的任何其他项

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

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

您需要删除
返回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));

您需要删除
返回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));

您试图调试这个问题的原因是什么?我认为您必须在
json_decode
中添加seconde参数(true),以避免
无法使用stdClass类型的对象作为数组
错误这看起来像是测试驱动开发的一个很好的练习:)您试图调试这个问题的原因是什么?我认为您必须添加seconde参数(true)在
json\u decode
中,为了避免
不能使用stdClass类型的对象作为数组
错误,这看起来像是测试驱动开发的一个极好的练习:)如果您返回第一个包含子项的项,您将永远不会处理整个数组。如果您返回第一个包含子项的项,您永远不会处理整个阵列。