2016-05-21 2 views
1

Я пытаюсь написать php-код, который бы приносил мне многоуровневое меню с неограниченной глубиной. Я хочу иметь возможность сделать это только с одним запросом и одним циклом. Вот что у меня есть: У меня есть таблица menu_items со следующими столбцами:Многоуровневое меню в mysql/php

id 
categories_id (overall menu id) 
title (Text title) 
link (Link) 
ord (the order within the category itself) 
parent (Parent item, which is basically another item, different from categories_id) 
depth (Menu level. For whatever reason, I think it's going to help me to know the depth of every particular item) 

Все пункты меню связаны с определенным меню по categories_id, и все они связаны с их родительского элемента на «родителя» с элементами верхнего уровня, имеющими 0 для родителя.

Теперь мне нужно, чтобы mysql возвращал мне весь список элементов (под теми же category_id) таким образом, чтобы один проход цикла мог организовать их в симпатичном многомерном массиве.

Как бы я это сделал? Один из способов, которым я думал, это сделать, если бы я мог заставить MySQL заказывать элементы таким образом, чтобы каждый элемент выполнялся всеми его дочерними элементами.

Например: Если у меня есть эта структура:

Item 1 
Item 2 
    Item 3 
    Item 4 
     Item 5 
    Item 6 
Item 7 
Item 8 

Где пункты 1,7 и 8 являются верхнего уровня пустые элементы, пункт 2 имеет троих детей, и 4 пп имеет пункт 5 в качестве своего ребенка

Мне понадобится mysql, чтобы заказать вышеуказанные товары таким образом: Пункт 1, затем пункт 2, после этого, поскольку в пункте 2 есть дети, он должен вывести элементы 3 и 4, так как 4 имеет ребенка, его следует продолжить пункт 5, затем возвращается к пункту 6 ... и т. д.

Есть ли способ заставить MySQL заказать его вот так? Или я мог бы достичь этого каким-то другим способом?

Извините, если мой вопрос немного запутан.

+0

Существует довольно простое объяснение иерархических структур данных: http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/ –

ответ

1

Если вы хотите загрузить все с помощью одного запроса, что имеет смысл, потому что, скорее всего, у вас не будет тысяч элементов в меню, тогда вы можете упростить свою задачу и сделать больше с помощью PHP вместо чрезмерного компрометации SQL-запроса.

Итак, сначала вы просто загрузить все с простейшим запросом:

$items = query('SELECT * FROM `menu_items` WHERE categories_id = ? ORDER BY `ord` asc'); 

таким образом заказ будет сохранившегося после деления всех элементов в подменю. Тогда вам нужен только один цикл для построения структуры меню.

$itemsById = []; 
$children = []; 
foreach ($items as $item) { 
    $itemsById[$item['id']] = $item; 
    $children[$item['parent']][] = $item['id']; 
} 

И вы можете распечатать его рекурсивно, начиная с $children[0].

Смежные вопросы