【问题标题】:Recursive function never return my temp array递归函数永远不会返回我的临时数组
【发布时间】:2016-02-19 15:55:14
【问题描述】:

我假设我的循环不断循环并清除我的临时数组,但不知道如何解决这个问题。最后,return 总是空的。

如何正确返回我的temp 数组?

数据集:

Array(
    [0] => Array(
            [0] => Array(
                    [id] => 55
                    [parent] => 49
                )
            [1] => Array(
                    [id] => 62
                    [parent] => 50
                )
            [2] => Array(
                    [id] => 64
                    [parent] => 51
                )
        )
    [1] => Array(
            [0] => Array(
                    [id] => 49
                    [parent] => 0
                )
        )
)

功能:

<?php

    $patterns = function($array, $temp = array(), $index = 0, $parent = 0) use(&$patterns) {
        if($index < count($array)) {
            foreach($array[$index] as $sub) {
                if($index == 0 || $parent == $sub['id']) {
                    $temp[$index] = $sub['id'];
                    $patterns($array, $temp, $index + 1, $sub['parent']);
                }
            }
        }

        if($index >= count($array) && $parent == 0) {
            print_r($temp); // correct result does display here!

            return $temp; // this return gives no return
        }
    };

    print_r($patterns($dataset));

?>

print_r 返回Array ( [0] =&gt; 55 [1] =&gt; 49 )

【问题讨论】:

  • 请期待输出。

标签: php recursion return


【解决方案1】:

在第 8 行,仅当 $patterns($array, $temp, ...) 不为空时才返回结果。另外,不要将结果设置为$temp 变量,因此如果结果为空,则不要覆盖它。

像这样:

$temp2 = $patterns($array, $temp, $index + 1, $sub['parent']);

if (isset($temp2)) {
    return $temp2;
}

如果第13行的条件不成立,它会返回null,这不是你想要的结果,所以如果它是null,你必须继续。


顺便说一句,我无法重现您的代码并给出正确答案,其中显示// correct result does display here!。为了使它工作,我不得不将第 5 行和第 6 行更改为:

foreach($array[$index] as $key => $sub) {
    if ($key == 0 || $parent == $sub['id']) {

我还必须将第 13 行更改为:

if($index >= count($array)-1 && $parent == 0) {

【讨论】:

  • 非常感谢!第 5、6 和 13 行的更改打破了逻辑。返回变量有效!
  • 啊刚刚意识到我的数据集已经反转,所以不需要再次反转。这就是你无法得到结果的原因。我的错。
【解决方案2】:

当您修改第 6 行并在其开头添加“return”时会发生什么?

    RETURN $patterns($array, $temp, $index + 1, $sub['parent']);

【讨论】:

  • 其实我看到了什么。您的“return $temp”行不在我可以看到的任何函数中。它在 $patterns 函数之外。您的 $temp 值在此时设置 - 但无处“返回”它。是这样吗?