【问题标题】:Recursive function only works for first level of array递归函数仅适用于第一级数组
【发布时间】:2020-12-17 12:14:08
【问题描述】:

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

【问题讨论】:

  • 你尝试过什么调试问题?
  • 我认为您必须在json_decode 中添加seconde 参数(true),以避免Cannot use object of type stdClass as array 错误
  • 这看起来像是测试驱动开发的绝妙练习 :)

标签: php recursion


【解决方案1】:

您需要删除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】:

    问题是你有

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

    部分完成,这将忽略后续元素中的任何其他项目。

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

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

    【讨论】:

    • 如果您在第一个包含任何子项的项处返回,您将永远不会处理整个数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多