интересный казус с рекурсией

predator

web designer
интересный казус с рекурсией

немогу понять почему так.
вот код:
PHP:
	function tree_ids( &$arrIds, &$arrTree, $_intId=0 ) {
		foreach( $arrTree as $v ) {
			if ( $v['pid']==$_intId ) {
				$arrIds[]=$v['id'];
				$this->tree_ids( $arrIds, $arrTree, $v['id'] );
			}
		}
	}
он не срабатывает как надо, т.е. не выводит ид-шники ветки нужной, которая начинается с $_intId
дерево adjency list: id->pid.

додумался до того что пойнтер в массиве при каждой рекурсии не устанавливается на начала массива
поставил reset( $arrTree );

тоже не помогло !!!

только когда убрал амперсанд перед $arrTree заработало, оно и понятно
при каждой рекурсии создаётся копия массив $arrTree. Но это затратно с точки зрения затрат памяти.

в принципе не критично в моей задаче, но чисто теоретически может кто-нить объяснить из-за чего reset( $arrTree ); не помогает?
 

predator

web designer
ну хорошо )
допустим при запуске foreach пойнтер автоматом ставится в начало массива, тогда почему всётаки со ссылкой неработает?
при рекурсии ведь запоминается состояние функции, полностью.

-~{}~ 15.02.07 16:58:

и тем более что
Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself.
 

OZ

Новичок
Тогда зачем тебе пользоваться foreach, если он делает то, чего ты хочешь избежать?
 

hermit_refined

Отшельник
predator
вы не можете иметь два указателя в одном массиве.
допустим при запуске foreach пойнтер автоматом ставится в начало массива, тогда почему всётаки со ссылкой неработает?
всё работает. советую вам понять, что происходит, например, здесь:
PHP:
$a = array(1, 2);
$b = &$a;
foreach ($a as $v)
    foreach ($a as $vInner)
        echo "    $v $vInner\n";

/* Output:
    1 1
    1 2
*/
P.S. +1 к кол-ву результатов по "неработает".
 
Сверху