Многоуровневое дерево

У меня есть таблица db, где размещаются пункты меню. Моя таблица имеет 3 столбца: id, parent_id и имя. Я хочу построить дерево из этой таблицы. Как это можно сделать?

1
nl ja de
Вам нужна рекурсивная функция, найдите подстатьи, используя текущие записи parent_id, запросив их с помощью parent_id = $ id .
добавлено автор mario, источник
google MySQL вложенный набор .
добавлено автор prodigitalson, источник
добавлено автор Bill Karwin, источник

2 ответы

Попробуйте этот код

$query = "SELECT * FROM menu_items";
$result = mysql_query($query);

if (mysql_num_rows($result) > 0) {
    $myTreeArray = array();
    while ($row = mysql_fetch_assoc($result)) {
        if(!isset($myTreeArray[$row['parent_id']])){
            $myTreeArray[$row['parent_id']] = array();
        }
        array_push($myTreeArray[$row['parent_id']], array($row['id'] => $row['name']));
    }
}

echo '
';
print_r($myTreeArray);
echo '
';

Это даст вам ассоциативный массив со списком элементов меню, индексированных их родительским идентификатором. Затем вы можете выполнить цикл над $ myTreeArray и распечатать список.

2
добавлено
это не работает, возможно, в этой строке есть некоторая ошибка array_push ($ myTreeArray [$ row ['parent_id']], array ($ row ['id'] => $ row ['name']));
добавлено автор moonvader, источник
Ты ты! теперь он работает, и я вижу ассоциативный массив. мне нужна рекурсивная функция PHP для сборки дерева сейчас?
добавлено автор moonvader, источник
можете ли вы предложить этот вложенный foreach? я не знаю, как это сделать
добавлено автор moonvader, источник
Было бы здорово, если бы вы могли опубликовать номер строки и ошибку, с которой вы столкнулись :)
добавлено автор Shikhar Kapoor, источник
Отредактировал код. Теперь он работает отлично. :)
добавлено автор Shikhar Kapoor, источник
Просто простой вложенный foreach ($ myTreeArray как $ key => $ value) должен сделать трюк сейчас.
добавлено автор Shikhar Kapoor, источник

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

Вот несколько полезных руководств по настройке:

http://www.sitepoint.com/hierarchical-data-database/ (it doesn't actually use the term nested sets, but page 2 describes the same concept under the heading "Modified Preorder Tree Traversal")

http://mycrazydream.net/ 2009/04/вложенные наборы-для-категории-структура-в-MySQL-базы данных/

1
добавлено
Спасибо! первый учебник похож на мой случай. вложенные наборы хороши, но на этот раз у меня есть структура таблицы без левого и правого ключей.
добавлено автор moonvader, источник
@Slowcoder Да, я думаю, что вложенные наборы будут хорошим решением в вашем случае. Скорее всего, это будет быстрее, чем любой другой подход с использованием реляционной базы данных. Базы данных, отличные от SQL («NoSQL») становятся все более популярными в наши дни, и по многим веским причинам две из них лучше поддерживают иерархические данные и улучшают масштабируемость, но в большинстве случаев, особенно если вы не создали много систем но я бы сказал, что придерживаюсь SQL, так как есть больше ресурсов для его изучения, и это хорошо работает для большинства систем.
добавлено автор Matt Browne, источник
@Slowcoder Ах, интересно, я всегда думал, что вложенные наборы были самыми быстрыми, независимо от того, но я не эксперт в этой области. Конечно, вы должны подумать о том, как вы собираетесь обращаться к дереву, например. сколько данных вы планируете запросить сразу и есть ли какие-либо естественные деления, которые можно разделить на разные таблицы или что-то в этом роде.
добавлено автор Matt Browne, источник
@Matt - Ваше предложение об использовании вложенных наборов полезно для меня на стороне mysql. Я также обрабатываю иерархические данные в моей базе данных, а дерево содержит около 1 миллиона узлов. Будут ли вложенные наборы все еще работать для меня (учитывая количество узлов, которые будут обновляться для левого и правого значений всякий раз, когда новый узел добавляется в дерево)?
добавлено автор Slowcoder, источник
Спасибо, Мэтт. Я прочитал статью в ссылке . В разделе «Недостатки» сказано, что вложенные наборы могут не работать хорошо для дерева с большим количеством узлов, поэтому мы можем использовать вложенные интервалы. Надо читать, что это такое.
добавлено автор Slowcoder, источник
@MattB. - Запрос будет определенно быстрее даже в более крупном дереве. Но каждый раз, когда новый узел добавляется в глубину дерева, левое и правое значения должны обновляться для всех узлов в этой иерархии для левой и правой. Я буду анализировать, как это работает в моем случае. Спасибо за ваши предложения.
добавлено автор Slowcoder, источник
phpGeeks
phpGeeks
3 620 участник(ов)

Best PHP chat Еще: @dbGeeks - базы данных @phpGeeksJunior - новичкам @moscowProgers - IT Москва @ebanoePhp - весёлый канал о PHP @laravel_pro - Laravel @jobGeeks - вакансии @jsChat - JS Правила: https://t.me/phpGeeks/764859 ДР - 28.03.2016

DBA - русскоговорящее сообщество
DBA - русскоговорящее сообщество
1 345 участник(ов)

Общаемся и обсуждаем темы, посвященные DBA, PostgreSQL, Redis, MongoDB, MySQL, neo4j, riak и т.д. См. также: @devops_ru, @kubernetes_ru, @docker_ru, @nodejs_ru Рекомендуем сразу отключить уведомления, чтобы пребывание здесь было полезным и комфортным.

PHP
PHP
1 309 участник(ов)

Группа про современный PHP. Обсуждаем ООП, TDD, BDD, DDD, SOLID, GRASP и прочие крутые базворды Для ознакомления: https://gist.github.com/mkusher/711bd46f0b62fbae851182e6fb3b1839 Группа PHP для новичков @phpGeeksJunior Вакансии: https://t.me/fordev

PHP — вакансии, поиск работы и аналитика
PHP — вакансии, поиск работы и аналитика
1 251 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению PHP, Laravel, Symfony, Yii и т.д. Здесь всё: full-time, part-time, remote и разовые подработки. См. также: @qa_jobs, @devops_jobs, @javascript_jobs, @nodejs_jobs, @uiux_jobs, @products_jobs

MySQL
MySQL
995 участник(ов)

The group is about MySQL. For code use hastebin.com. Admin: @smlkw

phpGeeksJunior
phpGeeksJunior
980 участник(ов)

Группа для новичков. Не стесняйтесь задавать вопросы по php. Не флудить!!!! Правила и полезные ссылки https://gist.github.com/exileed/a53dd0617b35a705ff44b38c8028e6a5 Бест от пхпгикс https://t.me/best_of_phpgeeks

phpclub.ru
phpclub.ru
872 участник(ов)

Официальный чат phpclub.ru - остерегайтесь подделок #rules Правила группы - уважайте друг друга. Скриншоты -> ссылками. Код -> pastebin.com. Вакансии строго -> https://goo.gl/4bNxym, в чат ссылку. За рекламу и мат - БАН!

Devall | PHP
Devall | PHP
272 участник(ов)

Пристанище для восходящих звёзд разработки, которые перейдут на более адекватные языки. http://combot.org/chat/-1001014863761 Инвайт: j.mp/devallphp