Меню иерархической рекурсии с PHP/MySQL
Вопрос
На этот вопрос (надеюсь) некоторым из вас будет довольно легко ответить.
У меня есть рабочее рекурсивное меню из базы данных MySQL, теперь моя основная проблема:
Как лучше всего создать URL-адрес?Я бы предпочел ввести заголовок каждой строки, например /eggs/milk/bacon/.Яйца уровня 0, например:яйца-0, молоко-1, бекон-2.Есть идеи о том, как динамически выводить это?
Я в значительной степени придерживаюсь того, что «cletus» сказал несколькими комментариями по этому вопросу:PHP/MySQL – построение иерархии навигационного меню
Но мне нужно немного больше объяснений о том, как это сделать.
Решение
Если вы не планируете часто изменять свое дерево меню, предварительное сохранение требуемого иерархического URL-адреса для каждого пункта меню, вероятно, является самым простым (для разрешения во время выполнения).
Если вы ожидаете, что дерево будет изменяться достаточно часто, скажем, через веб-интерфейс, то было бы проще генерировать пути каждый раз, когда вы читаете меню, примерно так:
id | name | parent
----+--------+-------
0 | eggs | NULL
1 | milk | 0
2 | bacon | 1
3 | tomato | 0
4 | lettuce| 1
foreach (query("SELECT * FROM menu ORDER BY parent ASC") as $row) {
$menuitem = array_merge(array(), $row);
$menuLookup[$menuitem['id']] &= $menuitem;
if ($menuitem['parent'] == null) {
$menuitem['path'] = "/" . $menuitem['name'];
$menu[] &= $menuitem[];
} else {
$parent &= $menuLookup[$menuitem['parent']];
$menuitem['path'] = $parent['path'] . "/" . $menuitem['name'];
$parent['menu'][] &= $menuitem;
}
}
Я не отлаживал этот код, а только проверял его на корректность ;-)
Другие советы
Что ж, если вам нужна иерархия, лучший метод, который я знаю, называется «Модифицированный обход дерева предварительного заказа», который описан очень подробно. в этой статье Sitepoint, начинается примерно на полпути вниз.
Основное отличие от того, что предложил Гасс, заключается в том, что это немного более производительно и намного проще получить только ту часть дерева, которую вы ищете.
я написал что-то в groovy: http://blog.srvme.de/2009/11/29/reading-a-reflexive-association-in-a-recursive-way-for-grails-and-groovy/