Это должно (надеюсь) быть довольно простым вопросом для некоторых из вас, чтобы ответить.
У меня есть рабочее рекурсивное меню из базы данных mySQL, теперь моя главная проблема:
Каков наилучший способ создания URL-адреса? Я бы предпочел принести название каждой строки, например / яйца / молоко / бекон /. Яйца составляют 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/