Вопрос

На этот вопрос (надеюсь) некоторым из вас будет довольно легко ответить.

У меня есть рабочее рекурсивное меню из базы данных 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, начинается примерно на полпути вниз.

Основное отличие от того, что предложил Гасс, заключается в том, что это немного более производительно и намного проще получить только ту часть дерева, которую вы ищете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top