Многоуровневое меню, основанное на базе PHP

Я хочу создать многоуровневое меню, основанное на базе данных. Я получил его из [ http://abhijitpal.in/][1], но проблема здесь в том, что я не могу поместить class = "dropdown" только в верхние меню <ul> , он также распространяется и на подменю. Я немного изменил, но не знаю, как использовать рекурсивную функцию. Ниже приведен код, пожалуйста, посмотрите, можете ли вы помочь

 <?php /** Function to display Catelogue Menu */ //select all rows from the main_menu table $q ="SELECT * FROM catelogue WHERE cat_visibility = '1'"; $r = mysqli_query($dbc, $q); //create a multidimensional array to hold a list of menu and parent menu $menu = array( 'menus' => array(), 'parent_menus' => array() ); //build the array lists with data from the menu table while ($row = mysqli_fetch_assoc($r)) { //creates entry into menus array with current menu id ie. $menus['menus'][1] $menu['menus'][$row['cat_id']] = $row; //creates entry into parent_menus array. parent_menus array contains a list of all menus with children $menu['parent_menus'][$row['cat_parentid']][] = $row['cat_id']; } // Create the main function to build milti-level menu. It is a recursive function. function nav_catelogue($parent, $menu) { //$html = ""; if (isset($menu['parent_menus'][$parent])) { ?> <ul> <?php foreach ($menu['parent_menus'][$parent] as $menu_id) { if (!isset($menu['parent_menus'][$menu_id])) { ?> <li><a href="<?php echo $menu['menus'][$menu_id]['link']; ?>"><?php echo $menu['menus'][$menu_id]['cat_name']; ?></a></li> <?php } if (isset($menu['parent_menus'][$menu_id])) { ?> <li><a href="#"><?php echo $menu['menus'][$menu_id]['cat_name']; ?></a> <?php echo nav_catelogue($menu_id, $menu); ?> </li> <?php } } ?> </ul> <?php } } ?> 

Моя структура базы данных

 ----------------------------------------- | cat_id | cat_name | cat_parentid | ----------------------------------------- | 1 | Home | 0 | | 2 | About | 0 | | 3 | Contact | 0 | | 4 | History | 2 | | 5 | Services | 2 | ----------------------------------------- 

Желаемый результат Я хочу:

  • ГЛАВНАЯ
  • ОКОЛО
    • история
    • Сервисы
  • контакт

Это окончательный код в соответствии с @Mave

 <?php /** Function to display Catelogue Menu */ //select all rows from the main_menu table $q ="SELECT * FROM catelogue WHERE cat_visibility = '1'"; $r = mysqli_query($dbc, $q); //create a multidimensional array to hold a list of menu and parent menu $menu = array( 'menus' => array(), 'parent_menus' => array() ); //build the array lists with data from the menu table while ($row = mysqli_fetch_assoc($r)) { //creates entry into menus array with current menu id ie. $menus['menus'][1] $menu['menus'][$row['cat_id']] = $row; //creates entry into parent_menus array. parent_menus array contains a list of all menus with children $menu['parent_menus'][$row['cat_parentid']][] = $row['cat_id']; } // Create the main function to build milti-level menu. It is a recursive function. function nav_catelogue($parent, $menu, $top = false) { if (isset($menu['parent_menus'][$parent])) { //this is short code for if($top === true) { //do true } else { //do false } echo $top ? '<ul class="dropdown">' : '<ul>'; foreach ($menu['parent_menus'][$parent] as $menu_id) { if (!isset($menu['parent_menus'][$menu_id])) { echo '<li><a href="' . $menu['menus'][$menu_id]['link'] . '">' . $menu['menus'][$menu_id]['cat_name'] . '</a></li>'; } if (isset($menu['parent_menus'][$menu_id])) { echo '<li><a href="#">' . $menu['menus'][$menu_id]['cat_name'] . '</a>' . nav_catelogue($menu_id, $menu) . '</li>'; } } echo '</ul>'; } } ?> 

 function nav_catelogue($parent, $menu, $top = false) { if (isset($menu['parent_menus'][$parent])) { //this is short code for if($top === true) { //do true } else { //do false } echo $top ? '<ul class="dropdown">' : '<ul>'; foreach ($menu['parent_menus'][$parent] as $menu_id) { if (!isset($menu['parent_menus'][$menu_id])) { echo '<li><a href="' . $menu['menus'][$menu_id]['link'] . '">' . $menu['menus'][$menu_id]['cat_name'] . '</a></li>'; } if (isset($menu['parent_menus'][$menu_id])) { echo '<li><a href="#">' . $menu['menus'][$menu_id]['cat_name'] . '</a>' . nav_catelogue($menu_id, $menu) . '</li>'; } } echo '</ul>'; } } 

Когда вы сначала вызываете nav_catelogue (нет в вашем текущем коде), вызовите его с помощью nav_catelogue($menu_id, $menu, true);

У вас есть два способа сделать вашу рекурсивную функцию

 class="dropdown" 

Первый способ – использовать стиль вызова / вызова, в котором ваша вызывающая функция будет обрабатывать первый случай (class = "dropdown"), а затем вызывать рекурсивную функцию, которая будет обрабатывать общий случай (без раскрывающегося списка class = ").

Добавьте аргумент (boolean?), Который вы будете передавать при первом вызове и который добавит class = "dropdown". На рекурсивных вызовах вы передадите это логическое значение как ложное (без вставки класса = "выпадающего списка").