-1); $simpsons[-6ren">
gpt4 book ai didi

PHP递归函数在不同版本中的工作方式不同?

转载 作者:可可西里 更新时间:2023-11-01 13:42:59 24 4
gpt4 key购买 nike

这让我发疯。递归函数在 5.4.4 和 5.1.6 中的工作方式似乎不同(我无法控制的客户端的托管服务器)。除了举例,我无法真正解释它:

<?php
$simpsons[0] = array("name"=>"Abe","parent"=>-1);
$simpsons[1] = array("name"=>"Homer","parent"=>0); // Homer's parent is Abe
$simpsons[2] = array("name"=>"Bart","parent"=>1); // Bart's parent is Homer
$simpsons[3] = array("name"=>"Lisa","parent"=>1); // Lisa's parent is Homer
$simpsons[4] = array("name"=>"Maggie","parent"=>1); // Maggie's parent is Homer


function get_children($parent) {
global $simpsons;

foreach ($simpsons as $index=>$onesimpson) {
if ($onesimpson["parent"]==$parent) {
echo "$onesimpson[name] is a child of ".$simpsons[$parent]["name"].".<br />\n";
get_children($index);
}
}
}

get_children(0);
?>

在 PHP 5.4.4 上输出是

Homer is a child of Abe.
Bart is a child of Homer.
Lisa is a child of Homer.
Maggie is a child of Homer.

在 PHP 5.1.6 上输出是

Homer is a child of Abe.
Bart is a child of Homer.

我不擅长术语,所以我无法解释发生了什么(就像在 5.1.6 中,即使被调用函数完成,被调用函数也会更改调用函数的参数),但我已经在这两个版本的在线 PHP 沙箱问题是相同的 - 它不特定于我的设置或托管服务器设置。

最佳答案

我不确定是什么改变使它在 5.2 中开始工作,但是一个数组只有一个内部指针(这是 foreach 使用的),所以当你使用这样的全局数组时,你会看到结果高达 5.2 的版本很有意义。您启动一个 foreach 循环,内部指针前进,然后递归调用 get_children,启动另一个 foreach 循环,内部指针重置,然后遍历数组。

当你返回到被调用者时,内部指针已经在数组的末尾并且 foreach 循环将完成。 To quote the manual :

As foreach relies on the internal array pointer changing it within the loop may lead to unexpected behavior.

在同一个数组的 foreach 中使用 foreach 就是一个例子。

编辑 我发现了一些在 5.2.1 版中标记为已修复的相关错误报告:

事实证明,foreach 在数组的克隆上工作,因此嵌套 foreach 循环是完全有效的,这确实是一个错误,在 5.2.1 版本之前,数组引用没有被克隆到 foreach 循环中。

关于PHP递归函数在不同版本中的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18362737/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com