Справка по меню рекурсивного меню навигации PHP

Я пытаюсь добавить динамическое рекурсивное меню списка навигации на сайт, над которым я работаю. Сценарий состоит в том, что в меню есть 2 уровня, связанные с родителем (preid).

Моя проблема в том, что я могу правильно отображать список 1-го уровня, однако я не могу правильно отобразить второй уровень. Я не уверен, где добавить теги UL и / UL для второго уровня.

Это то, что я после

<ul> <li>Item 1</li> <li>item 2</li> <li>item 3</li> <ul> <li>sub item 1</li> <li>sub item 2</li> </ul> <li>Item 4</li> <li>item 5</li> <ul> <li>sub item 1</li> <li>sub item 2</li> </ul> <li>item 6</li> </ul> 

На самом деле это то, что я получаю с приведенным ниже кодом:

  <ul> <li>item 1 <ul> </ul> </li> <li>item 2 <ul> <li>sub item 1</li> <ul> </ul> <li>sub item 2</li> <ul> </ul> </ul> </li> <li>Sports Injuries <ul> </ul> </li> </ul> </li> </ul> 

Ниже приведен файл класса, который я использую для создания меню:

 class Dynamic_Menu { function getConfig() { $this->DB_SERVER = 'localhost'; $this->DB_USER = '***'; $this->DB_PASS = '***'; $this->DB_NAME = '***'; } function __construct() { $this->getConfig(); $Conn = mysql_connect($this->DB_SERVER, $this->DB_USER, $this->DB_PASS); if (!$Conn) die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn)); $DB_select = mysql_select_db($this->DB_NAME, $Conn); if (!$DB_select) die("Error: ".mysql_errno($Conn).":- ".mysql_error($Conn)); } function select_row($sql) { //echo $sql . "<br />"; if ($sql!="") { $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error()); if ($result) { while($row = mysql_fetch_array($result)) $data[] = $row; } return $data; } } function recordCount($sql) { if ($sql!="") { $result = mysql_query($sql) or die("Error: ".mysql_errno().":- ".mysql_error()); if ($result) { $cnt = mysql_num_rows($result); return $cnt; } } } function getChild($id) { $menu = ""; $str = ""; $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$id' "; $res = $this->select_row($s); $menu .= '<ul>'; for ($i=0;$i<count($res);$i++) { $cnt_of_child = $this->recordCount("SELECT * FROM vcms_sys_explorer where preid = '".$res[$i][eid]."' "); //if ($cnt_of_child > 0) // $str = ''; //else // $str = " (is sub menu item)"; $menu .= '<li>'. $res[$i][name].$str.'</li>'; $menu .= $this->getChild($res[$i][eid]); } $menu .= '</ul>'; return $menu; } function getMenu($parentid) { $menu = ""; $s = "SELECT * FROM vcms_sys_explorer WHERE preid = '$parentid' "; $res = $this->select_row($s); $menu .= '<ul>'; for ($i=0;$i<count($res);$i++) { $menu .= '<li>'.$res[$i][name].$this->getChild($res[$i][eid]).'</li>'; if ((count($res) - 1) > $i) { } } $menu .= '</ul>'; return $menu; } } 

Я вызываю меню с помощью:

 $menu = new Dynamic_Menu(); $menu->getMenu(1); 

Может ли кто-нибудь помочь и объяснить, где мне нужно разместить метки уровня 2 UL и / UL. Я бил головой об этом в течение последних двух дней. Любая помощь будет принята с благодарностью, спасибо …

Solutions Collecting From Web of "Справка по меню рекурсивного меню навигации PHP"

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

 function get_list($parent) { $children = query('SELECT * FROM table WHERE parent_id = '.$parent); $items = array(); while($row = fetch_assoc($children)) { $items[] = '<li>'.$row['name'].get_list($row['id']).'</li>'; } if(count($items)) { return '<ul>'.implode('', $items).'</ul>'; } else { return ''; } } 

И это даст вам список, структурированный правильно, как:

 <ul> <li>Item 1</li> <li>Item 2 <ul> <li>Item 2.1</li> <li>Item 2.2</li> </ul> </li> </ul> 

Все, хотя этот вопрос не совпадает с вопросом, который я опубликовал 2 дня назад, вот результат того, что я пытался делать с папками, а не с БД. Следующее будет перемещаться по каталогу и всем вспомогательным каталогам указанного пути $ и выплескивать результаты во вложенном не упорядоченном списке по завершении запуска скрипта. Надеюсь, поможет.

 <?php function readDirs($path){ $dirHandle = opendir($path); echo "<ul>"; while ($item = readdir($dirHandle)) { $newPath = $path . "/" . $item; if (is_dir($newPath) && $item != '.' && $item != '..') { echo "<li><a href='$newPath'>$item</a>"; readDirs($newPath); } } echo "</li></ul>"; } $path = "./galleries"; readDirs($path); ?>