Есть мини-таблица БД скрин Код получения массива Код (Text): <? /* ====получение массива=== */ function catalog(){ $query = "SELECT * FROM brands ORDER BY parent_id, brand_name"; $res = mysql_query($query) or die(mysql_query()); //массив категорий $cat = array(); while($row = mysql_fetch_assoc($res)){ if(!$row['parent_id']){ $cat[$row['brand_id']][] = $row['brand_name']; }else{ $cat[$row['parent_id']]['sub'][$row['brand_id']] = $row['brand_name']; } } return $cat; } /* ====получение массива=== */ ?> Код вывода и формирования меню Код (Text): <ul class="nav-catalog" id="accordion"> <?php foreach($cat as $key => $item): ?> <?php if(count($item) > 1): // если это родительская категория ?> <h3><li><a href="#"><?=$item[0]?></a></li></h3> <ul> <?php foreach($item['sub'] as $key => $sub): ?> <li>- <a href="?view=cat&category=<?=$key?>"><?=$sub?></a></li> <?php endforeach; ?> </ul> <?php elseif($item[0]): // если самостоятельная категория ?> <li><a href="?view=cat&category=<?=$key?>"><?=$item[0]?></a></li> <?php endif; ?> <?php endforeach; ?> </ul> Что получилось сейчас http://phptest.com.swtest.ru/ Нужно сделать "testovay" дочерней "Раскладушки", т.е. меню 3-его уровня. Буду очень признателен, если подробно распишите, какие изменения нужно внести в код, php только начинаю изучать, заранее спасибо
php не причём, просто подумай головой как ты сам бы это сделал на бумажке и потом имея алгоритм напиши код.
С деревьями работает нормально только рекурсия. У вас адресация по числам, у меня по строкам, поэтому сами переделайте на числа: Код (PHP): /* at least these names must be id pid path (as key) and should not be field named 'c' - stands for child */ public function query_tree($query,$out=array()){ $rows=$this->query_use($query)->fetch_all(MYSQLI_ASSOC); // тут надо поменять на ваш mysql, это просто $tree=function(&$out,$pid=0) use(&$tree,&$rows) { foreach($rows as $row) { if($row['pid']==$pid) { $row['c']=array(); $tree($row['c'],$row['id']); $out[$row['path']]=$row; } } }; $tree($out); return $out; } В процессе чтения запроса так сделать не получится. Нужен весь массив сразу. Поэтому читайте все что запрос вернул и заворачивайте в дерево. По рендеру деревьев в сети полно вариантов, свой предложить не могу - там действующее вещество зарыто в куче специфики. ЗЫ То есть в эту функцию можно засовывать любой массив с любым количеством элементов (полей), главное чтоб обозначенные были (а имена можно поменять). И дочери сажаются в элемент "c" (сhild), поэтому такого поля в массиве не должно быть. Пустой "с" означает что нет детей, в непустом они будут по своим ключам. Добавлено спустя 15 минут 54 секунды: ЗЫЫ Пустой массив в качестве терминатора может показаться расточительством, но зато в такой массив без всяких проверок легко профтыкать еще массив. Скажем в последнюю ветку телефона А воткнуть массив с чехлами для этого телефона (заранее предусмотрев связь по id-pid между двумя таблицами). И так собрать по частям из БД полное дерево при необходимости. Однако тут потребуется уже нормальный такой класс чтоб он сам ориентировался в дереве и выдавал что затребовано. А потом при деструкте закешировал массив чтоб не беспокоить mysql по пустякам Добавлено спустя 9 минут 6 секунд: Да, с числами в адресах вам будет легче, со строками гемор - их же надо собирать от каждой дочери через /