PHP / MySQL – создание иерархии навигационного меню

Итак, последнее меню будет выглядеть примерно так:

Item B Item B-1 Item B-1-2 Item B-1-1 Item A SubItem A-1 SubItem A-2 Item C 

На основании следующих записей БД:

 id menu_title parent_menu_id menu_level weight 1 Item A 0 1 1 2 Item B 0 1 0 3 Item C 0 1 2 4 SubItem A-2 1 2 1 5 Item B-1 2 2 0 6 Item B-1-1 5 3 1 7 SubItem A-1 1 2 0 8 Item B-1-2 5 3 0 

Как я буду показывать? Я предполагаю, что это будет связано с хранением всех элементов в многомерном массиве, а затем каким-то образом прокручивать его …

Related of "PHP / MySQL – создание иерархии навигационного меню"

Работа с структурой данных, как и у вас, будет часто включать рекурсию или несколько запросов для построения дерева.

Рассматривали ли вы другие способы хранения иерархии? Проверьте измененный предварительный обход – вот хорошая статья на основе PHP об этом .

Иерархические данные несколько раздражают в базе данных отношений (исключая Oracle, у которой есть операторы в START WITH/CONNECT BY чтобы справиться с этим). В основном две модели : список смежности и вложенные наборы.

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

То, что я сделал бы (и сделал недавно на самом деле):

  • выберите все содержимое меню в одном запросе, упорядоченном по идентификатору родителя;
  • Построение дерева структуры меню с использованием ассоциативных массивов или классов / объектов;
  • Пройдите это дерево, чтобы создать вложенные неупорядоченные списки; а также
  • Используйте плагин jQuery, например Superfish, чтобы включить этот список в меню.

Вы строите что-то вроде этого:

 $menu = array( array( 'name' => 'Home', 'url' => '/home', ), array( 'name' => 'Account', 'url' => '/account', 'children' => array( 'name' => 'Profile', 'url' => '/account/profile', ), ), // etc ); 

и превратить его в это:

 <ul class="menu">; <li><a href="/">Home</a></li> <li><a href="/account">Account Services</a> <ul> <li><a href="/account/profile">Profile</a></li> ... 

PHP для генерации массива меню достаточно прост, но немного фиктивный для решения. Вы используете рекурсивную функцию древовидной ходьбы, которая создает разметку вложенного списка HTML, но оставит ее реализацию как упражнение для читателя. 🙂

Способ хранения иерархических данных не так эффективен, как вы могли бы захотеть. Я прочитал статью « Управление иерархическими данными в MySQL» несколько лет назад и с тех пор нашел ее лучшим решением для управления данными на основе иерархии в SQL. Следующим лучшим преимуществом является то, что я считаю, что вы можете захватить все дерево одним запросом.

Я просто разместил в подобном вопросе свой собственный подход, чтобы преобразовать иерархические данные MySQL (список смежности) в меню (HTML)

Он не использует рекурсию. И для этого требуется один запрос к базе данных.

Читайте больше на

https://stackoverflow.com/questions/2871861#3368622

Благодарю.

Еще один простой способ создать иерархию, если вы не хотите использовать вложенные наборы, – это использовать простую текстовую строку впереди.

 Item B Item B-1 Item B-1-2 Item B-1-1 Item A SubItem A-1 SubItem A-2 Item C 

Станет

 1 Item B 1.1 Item B1 1.1.1 Item B11 1.1.2 Item B12 2 Item A 2.1 Item A1 2.2 Item B2 3 Item C 

Цифра перед каждым элементом может храниться в поле и анализироваться на основе длины (представляющей глубину, где она есть), чтобы рассказать вам все, что вам нужно знать о том, где оно происходит.

Я использую иерархии вложенных наборов для более сложных вещей, которые требуют вычисления, e tc, но я считаю, что этот подход хорошо зарекомендовал себя