【问题标题】:PHP - Error when return an array from a recursive functionPHP - 从递归函数返回数组时出错
【发布时间】:2011-03-29 19:58:53
【问题描述】:

经过两个小时的挠头和谷歌搜索 - 我被困住了!

根据标题,我试图返回一个在函数循环时构建的数组。我只想在 else 上返回数组变量,但它不会合作。它只是从函数中返回空白,但是在 else 中我可以 print_r 它并按预期显示。它只是不会返回 $open_array 变量中的数组。任何想法(或滥用)将不胜感激!

function find_parent($number, $open = false) {
   if(isset($other_variable[$number])) {
        foreach($other_variable[$number] as $val) {
           $open[$val->id] = [$val->id;
           $open = find_parent([$val->id, $open);

        }
   }
   else {
    return $open;
   }
}

$open_array = find_parent($number);
print_r($open_array);

【问题讨论】:

  • 我没有看到 $other_variable 被定义在函数的范围内。
  • 还有[$val->id 没有有效的语法。这甚至可以运行吗?
  • 什么?你不使用递归来构建数组?你来自哪个星球,莫罗尼亚?
  • 这确实有效。当我 print_r($open) 得到我想要的数组时,它根本不会返回。此功能已被剥离,以免用不相关的代码轰炸你们:)。 [$val->id 应该是 [$val->id] 并且 $other_variable 应该在函数开始时全局化......对不起!
  • @Michael:递归构建数组有完全正当的理由。不要这么快判断。

标签: php recursion


【解决方案1】:

在“then”部分,您分配给 $open,但从不返回该值。所以你真的不能期望得到什么,除非你输入 else 部分,但它是一个未更改的版本。

所以这就是我要做的:我会选择一个不返回 $open 的版本。 在调用函数之前初始化 $open。 传下去。 然后根据需要进行修改。

实际上没有理由返回这个 $open 值,因为无论如何你都是通过引用传递它,即它应该始终是你正在操作的同一个对象(在那些情况下它不是,它可能是一个错误)。

这样,您可以专注于调用和返回的流程逻辑,并确保始终使用相同的数据结构。

更新

function find_parent($number, $open = false) { 
   if(isset($other_variable[$number])) { 
        foreach($other_variable[$number] as $val) { 
           $open[$val->id] = [$val->id; 
           $open = find_parent([$val->id, $open); 
           return $open; // INSERTED
        } 
   } 
   else { 
    return $open; 
   } 
} 

【讨论】:

  • 我理解您的评论,谢谢 :)。但是对我来说仍然没有意义我可以 print_r($open) 在 else 它按我期望的那样打印数组但我不能返回它?
  • 尝试在“then”部分返回它(见更新)。否则,该值设置在“then”部分,正确传递给递归调用,因此它也存在于“else”部分,但一旦返回前一个调用的“if”部分,就不会返回。
猜你喜欢
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
  • 2019-01-12
  • 2018-01-04
  • 2013-09-21
  • 2019-04-25
  • 1970-01-01
相关资源
最近更新 更多