У меня есть таблица с иерархическими меню, например
"id" "parent_id" "name" 1 0 menu 2 1 item1 3 2 item1_1 4 1 item2 5 4 item2_1 ... ...
и у меня есть 100 пунктов меню здесь. Чтобы получить все элементы в массиве, я должен написать рекурсивную функцию, подобную этой
getmenu function(parent_id = 1) { $items = mysql_query("SELECT id FROM table WHERE parent_id = " + parent_id); while ($item = msyql_Fetch_assoc($items)) { ...here I put them in array and call recursive function again to get sub items... getmenu($item['id']); } }
но это выполняет 100 запросов. Это лучший способ сделать это, чтобы получить иерархические меню из базы данных? Это так много загружает mysql?
$stmt = "SELECT id, parent_id FROM table"; $items = Array(); $result = mysql_query($stmt); while ($line = msyql_Fetch_assoc($result)) { $items[] = $line; } $hierarchy = Array(); foreach($items as $item) { $parentID = empty($item['parent_id']) ? 0 : $item['parent_id']; if(!isset($hierarchy[$parentID])) { $hierarchy[$parentID] = Array(); } $hierarchy[$parentID][] = $item; }
Уровень корня будет $hierarchy[0]
. Ключи – это элементы, идентификаторы и значения – все прямые дети.
Взгляните на Nested Sets, если вы не возражаете против более сложного решения. Вложенные наборы имеют очень хорошую производительность SELECT
и я предполагаю, что выбор здесь более важен.
С помощью Nested Sets сложные иерархические данные могут управляться очень модным и элегантным способом.