return из рекурсии: мой глюк или потенциальный подводный камень?

SelenIT

IT-лунатик :)
return из рекурсии: мой глюк или потенциальный подводный камень?

Задумавшись над задачкой с этого же форума (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.

В принципе, если вдуматься, оно достаточно логично, но недостаточно очевидно - особенно для новичков. Я сам потерял битый час в поисках разгадки этого "парадокса"...
 

tony2001

TeaM PHPClub
не пойму.
ты думал, что return выходит из всех уровней рекурсии сразу?
 

[Gisma]

Новичок
походу до такого только ты догадался.
Более интересно как ты раньше не столкнулся с этим вопросом;)
 

SelenIT

IT-лунатик :)
да, прикольное представление у меня было о return :) эх, стыдно-то как...

а раньше не сталкивался по элементарной причине - в подобных задачах обходился без рекурсии...
 
Сверху