|
|
|
| есть массив
$array = array(0=>array(
'title'=>'Super 1',
'parent'=>FALSE,
'url'=>'#',
'pos'=>1
),
1=>array(
'title'=>'Sub 1',
'parent'=>0,
'url'=>'#',
'pos'=>1
),
2=>array(
'title'=>'Super 2',
'parent'=>0,
'url'=>'#',
'pos'=>2
)
);
|
нужно разобрать его в
<ul>
<li><a href="#">Super 1</a>
<ul>
<li><a href="#">Sub 1</a></li>
</ul>
</li>
<li><a href="#nogo">Super 2</a></li>
</ul>
|
код писать не обязательно, просто идейку подкиньте.... заранее спасибо | |
|
|
|
|
автор: .................... (11.07.2009 в 17:40) |
|
|
для: michail1982
(11.07.2009 в 17:37)
| | У "Super 2" parent стоит "0", в HTML-коде на таком же уровне, как и "Super 1". И как это можно понять? | |
|
|
|
|
|
|
|
для: ....................
(11.07.2009 в 17:40)
| | parent - индекс родительского элемента массива, т,е super 1 & Super 2 - списки 1го уровня - sub 1 вложен в Super 1(parent=1)
изввените, там 0 || FALSE (некритично) | |
|
|
|
|
|
|
|
для: MIchail1982
(11.07.2009 в 17:44)
| | из построения массива и объяснения построение кода никак логически не следует, где то что то надо поменять | |
|
|
|
|
|
|
|
для: michail1982
(11.07.2009 в 17:37)
| | Идейку? Пожалуйста.
Попробуйте перенумеровать элементы массива с единицы. | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
автор: . (13.07.2009 в 00:30) |
|
|
для: MIchail1982
(12.07.2009 в 17:50)
| | Жесть какая-то. Передавайте хотя бы $arrayInput по ссылке. | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 00:30)
| | foreach не создает отдельную переменную в контексте вызванного экземпляра рекурсивной функции, а пользуется текущим указателем массива ( как одним из свойств этого объекта).
При использовании ссылки грохнется рекурсия.
Это, конечно, не повод копировать массив. Но просто поставить ссылку будет мало. | |
|
|
|
|
автор: . (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 в 02:23) |
|
|
для: .
(13.07.2009 в 02:22)
| | > По попробуйте привести пример ...
Но попробуйте привести пример ... | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:22)
| | Из того же мануала: обратите также внимание, что foreach работает с копией специфицированного массива, а не с самим массивом, следовательно, указатель массива не изменяется, как при работе конструкции each(), и изменения в возвращаемом элементе массива не влияют на массив-оригинал. | |
|
|
|
|
автор: . (13.07.2009 в 02:50) |
|
|
для: sim5
(13.07.2009 в 02:32)
| | Где конкретно это в мануале Вы нашли? Там, где я писал, была поправочка: "Unless the array is referenced ...". | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:50)
| | В мануале РНР4. Не знаю сохранился ли он на оф.сайте или нет, у меня есть. | |
|
|
|
|
|
|
|
для: .
(13.07.2009 в 02:22)
| | >Но попробуйте привести пример...
не буду. Неинтересно.
Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах. Не дублируя данные явно или неявно. Это, кстати, касается не только $arrayInput, но и $result. | |
|
|
|
|
автор: . (13.07.2009 в 14:45) |
|
|
для: Trianon
(13.07.2009 в 02:55)
| | > Интереснее было бы написать аналогичный код, который бы и вправду захватывал минимум памяти на рекурсивных вызовах.
& добавьте и всё. | |
|
|
|