Вопрос, собственно, кто как реализовывает рекурсивный проход по массиву, где может быть такая засада:
$aaa = array( 1,2,3,4 );
$aaa[4] = &$aaa;
var_dump( $aaa ); // эта сволочь знает, что это *RECURSION*!
print_r0( $aaa ) // например, это аналог print_r. циклится, естественно.
{
$r = "";
if( is_array( $aaa ) )
foreach( $aaa as $k => $v )
$r .= $k . ' = ' . print_r0( $v );
else
$r = $aaa;
return $r;
}
мысли пока “тупо в лоб”: завести массив ссылок, который объявить глобально в функции, заполнять в процессе прохода по элементам, и проверять, обрабатывался ли текущий элемент. (опять же, как проще?..)
Пошукал в пхп, ничего не нашукал про сравнение ссылок… И стало совсем печально ;(…
Есть ли аккуратное решение?
UPD:
Смотрю на вар_дамповский дамп и думаю…
Есть два типа данных в пхп, где может быть рекурсия.
Либо массив, либо объект.
Если массив - можно запоминать название и кол-во элементов.
Если объект - еще проще, да и реже в объектах рекурсия.
Таким образом, получаем, что с большой долей вероятности можно определить, что это цикл и не входить в перебор его(массива/объекта) элементов.
Возникает еще один не менее важный вопрос…
Как определить, что это элемент - ссылка (&)?
UPD:
Спасибо
digital_dog за подсказку.
Суть: Помечать пройденные элементы флагом посещения.