|
|
автор: . (13.07.2009 в 14:45) |
|
|
для: Trianon
(13.07.2009 в 02:55)
| | > Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах.
& добавьте и всё. | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:50)
| | В мануале РНР4. Не знаю сохранился ли он на оф.сайте или нет, у меня есть. | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:22)
| | >Но попробуйте привести пример...
не буду. Неинтересно.
Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах. Не дублируя данные явно или неявно. Это, кстати, касается не только $arrayInput, но и $result. | |
|
|
|
|
автор: . (13.07.2009 в 02:50) |
|
|
для: sim5
(13.07.2009 в 02:32)
| | Где конкретно это в мануале Вы нашли? Там, где я писал, была поправочка: "Unless the array is referenced ...". | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:22)
| | Из того же мануала: обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал. | |
|
|
|
|
автор: . (13.07.2009 в 02:23) |
|
|
для: .
(13.07.2009 в 02:22)
| | > По попробуйте привести пример ...
Но попробуйте привести пример ... | |
|
|
|
|
автор: . (13.07.2009 в 02:22) |
|
|
для: Trianon
(13.07.2009 в 00:36)
| | > foreach не создает отдельную переменную в контексте вызванного экземпляра рекурсивной функции, а пользуется текущим указателем массива ( как одним из свойств этого объекта).
Замечание: Unless the array is referenced, foreach operates on a copy of the specified array and not the array itself. foreach has some side effects on the array pointer. Don't rely on the array pointer during or after the foreach without resetting it.
Но одновременно с этим, вроде как и Вы правы насчёт
> При использовании ссылки грохнется рекурсия.
По попробуйте привести пример, когда рекурсия "грохнется" при передаче массива по ссылке и использования foreach. У меня не вышло. Однако, если заменить foreach на while( list(...) = each($arr) ), то "грохается". А ведь разве foreach не "сбрасывает" внутренний указатель массива перед использованием? По мануалу - сбрасывает. А разве each($arr) не использует как раз тот же указатель? Вроде тот же. Но при этом результаты разные. | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 00:30)
| | foreach не создает отдельную переменную в контексте вызванного экземпляра рекурсивной функции, а пользуется текущим указателем массива ( как одним из свойств этого объекта).
При использовании ссылки грохнется рекурсия.
Это, конечно, не повод копировать массив. Но просто поставить ссылку будет мало. | |
|
|
|
|
автор: . (13.07.2009 в 00:30) |
|
|
для: MIchail1982
(12.07.2009 в 17:50)
| | Жесть какая-то. Передавайте хотя бы $arrayInput по ссылке. | |
|
|
|
|
|
|
|
для: Trianon
(11.07.2009 в 21:54)
| | СПАСИБО!!!!
если кому пригодиться, вот код
function parse($arrayInput,$parentId = FALSE,$result = ''){
if(!$parentId){
$result .= '<ul class="pmenu">';
} else {
$result .= '<ul>';
}
foreach($arrayInput as $arrayKey => $arrayVal){
if($arrayVal['parent']==$parentId){
$result .= '<li><a href="'.$arrayVal['url'].'">'.$arrayVal['title'].'</a>';
$result .= parse($arrayInput,$arrayKey);
$result .= '</li>';
}
}
$result .= '</ul>';
$result = str_replace('<ul></ul>','',$result);
return $result;
}
echo parse($array);
|
| |
|
|
|
|