Меню навигации PHP / MySQL

Я пытаюсь создать функцию для иерархической навигационной панели меню.

Я хочу иметь что-то вроде этого …

<ul id="navigation"> <li><a href="#">Menu Item 1</a></li> <li><a href="#">Menu Item 2</a></li> <ul> <li><a href="#">Sub Menu Item 1</a></li> <li><a href="#">Sub Menu Item 1</a></li> </ul> <li><a href="#">Menu Item 3</a></li> <li><a href="#">Menu Item 4</a></li> </ul> 

Я использую эту функцию, но она работает неправильно, как хотелось бы. Он показывает основные родительские ссылки, но не дочерние ссылки.

 function build_navbar($pid,$sub=0) { global $db; $query = $db->simple_select("navbar", "*", "pid='".$pid."'", array("order_by" => "disporder")); $menu_build = "<ul id=\"navigation\">\n"; while($menu = $db->fetch_array($query)) { if($sub == 1) { $menu_build .= "<ul>\n"; $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n"; $menu_build .= "</ul>\n"; } else { $menu_build .= "<li><a href=\"#\">".$menu['title']."</a></li>\n"; } build_navbar($menu['id'],1); } $menu_build .= "</ul>\n"; return $menu_build; } 

Может быть, кто-то может помочь мне исправить это? Благодарю.

— Новое обновление —

Энди Грофф, это то, что выводит ваш код:

 <ul id="navigation"> <li><a href="#">Home</a></li> <ul> <li><a href="#">Child Link</a></li> <li><a href="#">Child 2</a></li> </ul> <li><a href="#">Parent</a></li> </ul> 

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

 <ul id="navigation"> <li><a href="#">Home</a> <ul> <li><a href="#">Child Link</a></li> <li><a href="#">Child 2</a></li> </ul> </li> <li><a href="#">Parent</a></li> </ul> 

Это то, что он выводит сейчас, Энди:

 <ul id="navigation"> </li> <li><a href="#">Home</a> </li> <ul> <li> <a href="#">Child Link</a> </li> <li><a href="#">Child 2</a> </ul> </li> <li><a href="#">Parent</a> </ul> 

Я думаю, что ваша проблема может иметь какое-то отношение к тому факту, что ваша функция рекурсивна, но строка, которую вы строите, каждый раз перезагружается в верхней части вашей функции, а не снова вводится в функцию. Кроме того, я не вижу нигде, что суб будет возвращаться к нулю для вашей последней итерации. Кроме того, кажется, что вам не нужно запрашивать каждую отдельную строку. Было бы более эффективно запрашивать один раз и строить все меню. Я думаю, что рекурсия может быть отброшена. Кроме того, я бы рекомендовал хранить флаг «sub» в ваших данных, вместо того, чтобы использовать некоторую трудную для понимания php-логику относительно того, является ли данная строка подменю. Я сделал изменения, основанные на этих понятиях, не знаю, работает ли это или нет, но поскольку у меня нет / нет необходимости создавать данные для его проверки:

 function build_navbar() { global $db; //first things first, i'd recommend putting a "sub" flag in your database. This example will use it. //start off by getting all of the rows. No need for recursion. $query = $db->simple_select("navbar", "*", "1", array("order_by" => "disporder")); $menu_build = "<ul id=\"navigation\">\n"; //keep track of what level we're at $level = 1; while($menu = $db->fetch_array($query)) { //get sub from data $sub = $menu['sub'] //we need to go back to root level if($sub == 0 && $level == 2){ $level--; $menu_build .= "</ul></li>\n"; } else $menu_build .= "</li>\n"; //we need to go up one level if($sub == 1 && $level == 1) { $level++; $menu_build .= "<ul><li>\n"; } else $menu_build .= "<li>"; //always print out a link $menu_build .= "<a href=\"#\">".$menu['title']."</a>\n"; } $menu_build .= "</ul>\n"; return $menu_build; } 

ОБНОВИТЬ:

Попробуй это:

 function build_navbar($pid, $sub=0) { global $db; $class = $sub ? "sub" : "navigation"; $menu_build = "<ul class=\"$class\">\n"; $query = $db->simple_select("navbar", "*", "pid='".$pid."'"); while($menu = $db->fetch_array($query)) { $menu_build .= "<li><a href=\"#\">".$menu['title']."</a>\n"; // build child links $menu_build .= build_navbar($menu['id'],1); } $menu_build .= "</ul>"; return $menu_build; } 

То, что мы делаем здесь, позволяет каждой функции создавать группу <ul><li> , переменная $sub будет определять, что будет идентификатором <ul> , что позволит вам по-разному определять каждую ul.


РЕДАКТИРОВАТЬ:

Я нашел это!

эта линия

 build_navbar($menu['id'],1); 

необходимо изменить на это:

 $menu_build = build_navbar($menu['id'],1); 

Похоже, он должен работать на меня.

То, что я сделал бы, это добавить некоторые echo отображающие SQL-запрос, который выполняется каждый раз, затем вы можете скопировать его в phpmyadmin (или какой-либо браузер db, который вы используете). Посмотрите, возвращает ли он нулевой результат. Если это так, может быть что-то не так с вашими данными.

так например:

 echo "SELECT FROM navbar * WHERE pid='$pid' ORDER_BY disporder;<br>";