За последние 24 часа нас посетили 49897 программистов и 1730 роботов. Сейчас ищут 622 программиста ...

Получение массива из базы и формирование 3-ех ур. меню

Тема в разделе "PHP для новичков", создана пользователем toren, 28 янв 2015.

  1. toren

    toren Активный пользователь

    С нами с:
    28 янв 2015
    Сообщения:
    14
    Симпатии:
    0
    Есть мини-таблица БД скрин

    [​IMG]

    Код получения массива

    Код (Text):
    1.  
    2. <?
    3. /* ====получение массива=== */
    4. function catalog(){
    5.     $query = "SELECT * FROM brands ORDER BY parent_id, brand_name";
    6.     $res = mysql_query($query) or die(mysql_query());
    7.    
    8.     //массив категорий
    9.     $cat = array();
    10.     while($row = mysql_fetch_assoc($res)){
    11.         if(!$row['parent_id']){
    12.             $cat[$row['brand_id']][] = $row['brand_name'];
    13.         }else{
    14.             $cat[$row['parent_id']]['sub'][$row['brand_id']] = $row['brand_name'];
    15.         }
    16.     }
    17.     return $cat;
    18. }
    19. /* ====получение массива=== */
    20. ?>
    Код вывода и формирования меню

    Код (Text):
    1.  
    2.  
    3.                 <ul class="nav-catalog" id="accordion">
    4.                     <?php foreach($cat as $key => $item): ?>
    5.                         <?php if(count($item) > 1): // если это родительская категория ?>
    6.                         <h3><li><a href="#"><?=$item[0]?></a></li></h3>
    7.                             <ul>
    8.                                 <?php foreach($item['sub'] as $key => $sub): ?>
    9.                                 <li>- <a href="?view=cat&category=<?=$key?>"><?=$sub?></a></li>
    10.                                 <?php endforeach; ?>
    11.                             </ul>
    12.                         <?php elseif($item[0]): // если самостоятельная категория ?>
    13.                             <li><a href="?view=cat&category=<?=$key?>"><?=$item[0]?></a></li>
    14.                         <?php endif; ?>
    15.                     <?php endforeach; ?>
    16.                 </ul>
    Что получилось сейчас http://phptest.com.swtest.ru/
    Нужно сделать "testovay" дочерней "Раскладушки", т.е. меню 3-его уровня.

    [​IMG]

    Буду очень признателен, если подробно распишите, какие изменения нужно внести в код, php только начинаю изучать, заранее спасибо:)
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    php не причём, просто подумай головой как ты сам бы это сделал на бумажке и потом имея алгоритм напиши код.
     
  3. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    С деревьями работает нормально только рекурсия. У вас адресация по числам, у меня по строкам, поэтому сами переделайте на числа:

    Код (PHP):
    1.     /*
    2.     at least these names must be
    3.     id
    4.     pid
    5.     path (as key)
    6.     and should not be field named 'c' - stands for child
    7.     */
    8.     public function query_tree($query,$out=array()){
    9.         $rows=$this->query_use($query)->fetch_all(MYSQLI_ASSOC); // тут надо поменять на ваш mysql, это просто
    10.         $tree=function(&$out,$pid=0) use(&$tree,&$rows) {
    11.             foreach($rows as $row) {
    12.                 if($row['pid']==$pid) {
    13.                     $row['c']=array();
    14.                     $tree($row['c'],$row['id']);
    15.                     $out[$row['path']]=$row;
    16.                 }
    17.             }
    18.         };
    19.         $tree($out);
    20.         return $out;
    21.     }
    В процессе чтения запроса так сделать не получится. Нужен весь массив сразу. Поэтому читайте все что запрос вернул и заворачивайте в дерево.

    По рендеру деревьев в сети полно вариантов, свой предложить не могу - там действующее вещество зарыто в куче специфики.

    ЗЫ То есть в эту функцию можно засовывать любой массив с любым количеством элементов (полей), главное чтоб обозначенные были (а имена можно поменять). И дочери сажаются в элемент "c" (сhild), поэтому такого поля в массиве не должно быть. Пустой "с" означает что нет детей, в непустом они будут по своим ключам.

    Добавлено спустя 15 минут 54 секунды:
    ЗЫЫ Пустой массив в качестве терминатора может показаться расточительством, но зато в такой массив без всяких проверок легко профтыкать еще массив. Скажем в последнюю ветку телефона А воткнуть массив с чехлами для этого телефона (заранее предусмотрев связь по id-pid между двумя таблицами). И так собрать по частям из БД полное дерево при необходимости. Однако тут потребуется уже нормальный такой класс чтоб он сам ориентировался в дереве и выдавал что затребовано. А потом при деструкте закешировал массив чтоб не беспокоить mysql по пустякам :)

    Добавлено спустя 9 минут 6 секунд:
    Да, с числами в адресах вам будет легче, со строками гемор - их же надо собирать от каждой дочери через /