PHP - 递归函数返回数组时出错

5

经过两个小时的思考和谷歌搜索,我陷入了困境!

如标题所述,我试图返回一个随着函数循环构建的数组。然而,我只想在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 被定义。 - NullUserException
[$val->id] 这里的语法不正确。这段代码能运行吗? - NullUserException
什么?你不使用递归来构建数组吗?你是从哪个星球来的,蠢货? - Michael Robinson
这个确实可以工作。当我打印print_r($open)时,我得到了我想要的数组,但它就是不会返回。这个函数已经被剥离了,以免用无关的代码轰炸你们 :). [$val->id应该是[$val->id],$other_variable应该在函数开始时全局化...抱歉! - Hayden
2
@Michael:递归构建数组有完全合理的原因。不要轻易下判断断。 - Tomalak
显示剩余3条评论
1个回答

3
在“then”部分,你给$open赋值,但是从未返回该值。因此,除非进入else部分,否则你不能真正期望得到任何返回值,但即使进入else部分,它也是一个未更改的版本。
所以这是我会做的:我会选择一个从未返回$open的版本。 在调用函数之前初始化$open。 传递它。 然后根据需要进行修改。
实际上没有理由返回这个$open值,因为你通过引用传递它,即你始终操作的应该是同一个对象(如果不是,则可能是一个bug)。
这样,你可以专注于调用和返回的流程逻辑,并确保始终与同一数据结构交互。
更新
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; 
   } 
} 

我理解了你的评论,谢谢 :). 但是我仍然不明白为什么我可以在else语句中打印print_r($open),它按照我的期望打印数组,但我却无法返回它? - Hayden
尝试在“then”部分返回翻译后的文本。否则,该值将在“then”部分设置,正确传递到递归调用中,因此它也存在于“else”部分,但是一旦返回前一个调用的“if”部分,它就不会被返回。 - Nicolas78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接