To doprowadza mnie do szału. Funkcje rekurencyjne wydają się działać inaczej w 5.4.4 i 5.1.6 (serwer hostingowy klienta, nad którym nie mam kontroli). I naprawdę nie można wytłumaczyć tylko przez przykład:Funkcje rekursywne PHP działają inaczej w różnych wersjach?
<?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);
?>
o PHP 5.4.4 wyjście jest
Homer is a child of Abe.
Bart is a child of Homer.
Lisa is a child of Homer.
Maggie is a child of Homer.
podczas PHP 5.1.6 wyjście jest
Homer is a child of Abe.
Bart is a child of Homer.
I "Nie jestem dobry z terminologią, więc nie mogę wyjaśnić, co się dzieje (to tak, jak w 5.1.6 wywołana funkcja zmienia parametr funkcji wywołującej, nawet gdy wywoływana funkcja się kończy), ale testowałem to w piaskownicy PHP online na te dwie wersje ons i problem są identyczne - nie jest to specyficzne dla mojej konfiguracji lub konfiguracji serwera hostingowego.
Problem potwierdzony: http://3v4l.org/n1mVc –
Nigdy nie definiujesz $ simpsons jako tablicy, która jest dla mnie pierwszą czerwoną flagą. Jeśli dodasz '$ simpsons = array();' zaraz po ' Php' wpłynie to na cokolwiek? –
@ AndrewG.Johnson: Tak smutny, jak to czyni mnie, to jest poprawny kod PHP. '$ simpsons [0] = array (" name "=>" Abe "," parent "=> - 1);' po prostu automatycznie utworzy tablicę. Dokumenty: http://www.php.net/manual/en/language.types.array.php#language.types.array.syntax.modifying Jest wysoce odradzany, ale jest ważny. –