Intereting Posts
Как замаскировать свой PHP-скрипт в качестве браузера? Неопределенный индекс с сеансами PHP Сортировка и фильтрация данных в GridView Yii2, где столбец отсутствует в базе данных Как отправить или присвоить значение переменной JQuery переменной php? хранить изображение в blob на сервере mysql, используя php и android Как вызвать событие mysql после периода времени? Как использовать оператор сравнения для числовой строки в mysql? Удаление повторяющихся данных из массива POST .env и файлы mail.php не будут обновляться – Laravel 5.1 Объект-объект «некоторая сущность» не может быть найден Проблема перенаправления PHP-страницы – Невозможно изменить информацию заголовка Node.js автоматически сбой mysql без какой-либо операции в нем Метод Amazon S3 – 405 Не допускается с помощью POST (хотя я разрешил POST на ковше) CakePHP 3 – Как использовать Trim () перед проверкой NotEmpty? Преобразование между степенью и Miliseconds

Меню иерархической рекурсии с PHP / MySQL

Это должно (надеюсь) быть довольно простым вопросом для некоторых из вас, чтобы ответить.

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

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