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

toren

Новичок
Есть мини-таблица БД скрин



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

Код:
<?
/* ====получение массива=== */
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;
}
/* ====получение массива=== */
?>
Код вывода и формирования меню

Код:
         <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 только начинаю изучать, заранее спасибо:)
 

toren

Новичок
Я гуглил, нечего толком не нашел, плюс php не очень хорошо знаю, только учусь, был бы признателен если бы описали на этом форуме
 

AmdY

Пью пиво
Команда форума
toren, тогда лучше начинать с обучения бользования поисковыми системами, а не бросаться сразу на php.
Прямо на данном портале есть масса статей по деревьям http://phpclub.ru/faq/Tree?v=w5u
 

Василий М.

Новичок
toren, тогда лучше начинать с обучения бользования поисковыми системами, а не бросаться сразу на php.
Прямо на данном портале есть масса статей по деревьям http://phpclub.ru/faq/Tree?v=w5u
плюсую
только еще совет - в ситуации с подобного рода деревьями (это Списки смежности (Adjacency List)) лучше делать не так как в статье написано, когда нужно потомков искать.
точнее так, но этот код должен срабатывать в фоне (в кроне) и записывать для каждого уровня своих прямых и всех потомков
это очень снижает кол-во запросов в случае, если дерево разрастается до тысяч элементов
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Василий М., чушь пишешь. получается денормализация и дублирование
1. в период от изменения дерева до перестроения по крону получаются неправильные результаты поиска
2. если дерево будет меняться в несколько потоков - получится большой привет с дедлоками и race condition
3, проблема скорости выборки вложенных элементов решается выбором правильного типа дерева, а не рукожопостью
 

Redjik

Джедай-мастер
да вообще 99 процентов алгоритмических задач решается выбором правильного хранилища данных
 

Василий М.

Новичок
получается денормализация
Вы так говорите, как будто в этом есть что-то плохое

1. в период от изменения дерева до перестроения по крону получаются неправильные результаты поиска
да все норм, раз в 15 минут срабатывает крон и обновляет актуальные данные о потомках

вот пример с дебагом внизу страницы. вся инфа о потомках категории не ищется с помощью 100500 запросов, а харнится в виде строки в поле.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Сама простота. Откуда ж такая наивная вера в то, что 15 минут автору некритично?

>>получается денормализация
>Вы так говорите, как будто в этом есть что-то плохое
теперь я: :D

ты тоже FK не юзаешь потому что тормозит?
иди юзай монго, Василий! для таких, как ты делали
 

Василий М.

Новичок
Причем тут FK?
Монго юзал, причем тут монго?

Я еще раз повторюсь - то, что написано в док-ии на пхпклубе - все эти примеры как лазать по потомкам, искать вершины и пр - это хорошо.
Но при каждом запросе этого делать не нужно.
Деревья вообще очень редко меняются.
Дерево с 5 уровнем вложенности для поиска потомков займет 5 запросов.
Это лишнее. Лучше в 5 утра крон запустить и пусть он денормализацию делает.

Короче учитесь пока я жив, оладухи.
 
Сверху