SelenIT
IT-лунатик :)
return из рекурсии: мой глюк или потенциальный подводный камень?
Задумавшись над задачкой с этого же форума (http://www.phpclub.ru/talk/showthread.php?s=&threadid=66228&rand=6), я, кажется, наткнулся на не вполне очевидное поведение конструкции return в рекурсивной функции. Похоже, что return обрывает только последний вложенный вызов, а предыдущие продолжаются как ни в чем ни бывало.
Вот такой код (видоизменен для иллюстративных целей с ущербом для исходной задачи)
выводит в конце:
Цель найдена, пора выходить!
6-я итерация...
Нигде в документации я не нашел описания такого поведения return из рекурсии. Поиск по форуму дал только одну ссылку на описание похожей проблемы - http://www.phpclub.ru/talk/showthread.php?s=&threadid=18519 (возможно, и там, и там искал невнимательно - цейтнот...)
PHP 4.3.9, проверено под Win2k и под Linux.
В принципе, если вдуматься, оно достаточно логично, но недостаточно очевидно - особенно для новичков. Я сам потерял битый час в поисках разгадки этого "парадокса"...
Задумавшись над задачкой с этого же форума (http://www.phpclub.ru/talk/showthread.php?s=&threadid=66228&rand=6), я, кажется, наткнулся на не вполне очевидное поведение конструкции return в рекурсивной функции. Похоже, что return обрывает только последний вложенный вызов, а предыдущие продолжаются как ни в чем ни бывало.
Вот такой код (видоизменен для иллюстративных целей с ущербом для исходной задачи)
PHP:
$tree = Array (
0 => Array ('level' => 1, 'id' => 1, ),
1 => Array (
0 => Array ('level' => 2, 'id' => 2, ),
1 => Array (
0 => Array ('level' => 3, 'id' => 3, ),
1 => Array ('level' => 3, 'id' => 4, ),
2 => Array ('level' => 3, 'id' => 5, ),
),
),
2 => Array ('level' => 1, 'id' => 6, ),
);
function my_path($id,$elements) {
static $path, $i;
foreach ($elements as $k=>$element) {
echo ++$i.'-я итерация...<br>';
if (isset($element['id'])) { // нет подуровней
$path[$element['level']] = $element['id'];
if ($element['id']==$id) {
echo 'Цель найдена, пора выходить!<br>';
return $path; // ...и что?
}
}
else { // рекурсивно обходим подуровни
my_path($id,$element);
}
}
}
print_r (my_path(3,$tree));
Цель найдена, пора выходить!
6-я итерация...
Нигде в документации я не нашел описания такого поведения return из рекурсии. Поиск по форуму дал только одну ссылку на описание похожей проблемы - http://www.phpclub.ru/talk/showthread.php?s=&threadid=18519 (возможно, и там, и там искал невнимательно - цейтнот...)
PHP 4.3.9, проверено под Win2k и под Linux.
В принципе, если вдуматься, оно достаточно логично, но недостаточно очевидно - особенно для новичков. Я сам потерял битый час в поисках разгадки этого "парадокса"...