Соорудил рекурсивную функцию для построения ветвящегося меню: PHP: <?php require('class/db.php'); require_once('class/class.php'); $time=new timer; // начинаем замер времени работы скрипта $db=new db('localhost', 'lalala', 'ololo', 'test', 1); // соединяемся с базой $db ->execQuery('SET NAMES utf8'); // ну как всегда ;) function printMenu($level=1, $pid=0) // аргументы: уровень вложенности и родительский id { global $db; $result=$db ->execQuery("SELECT `id`, `name`, `link` FROM `menu` WHERE `level`='{$level}' AND `parent`='{$pid}'"); if(mysqli_num_rows($result)==0) { return; } for($i=1; $i<$level; $i++) { echo ' '; } echo '<ul>'."\n"; while($arr=mysqli_fetch_assoc($result)) { for($i=1; $i<$level; $i++) { echo ' '; } echo ' <li><a href="'.$arr['link'].'">'.$arr['name'].'</a></li>'."\n"; printMenu($level+1, $arr['id']); } for($i=1; $i<$level; $i++) { echo ' '; } echo '</ul>'."\n"; } printMenu(); // запускаем функцию echo '<hr align="left" width="500"><br>'; echo $db->getQueryCount(); // выводим число sql-запросов за время работы $db->close(); echo '<br>'.$time->end_timer(); // выводим время работы скрипта Структура таблицы: [sql]CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, `link` varchar(255) CHARACTER SET cp1251 DEFAULT NULL, `level` smallint(6) DEFAULT NULL, `parent` smallint(6) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=21 DEFAULT CHARSET=utf8[/sql] name - то что будет отображено link - ссылка level - на каком уровне вложенности находится элемент parent - родительский id (у первого уровня вложенности parent=0) Имеется в общей сумме 13 элементов меню, выполняется всего 15 запросов (1 запрос - это SET NAMES). Время работы - 0.52645897865295 (0.5 уходит на подключение, не знаю почему так долго подключается, поднимал тут тему). Жду Ваших предложений и дополнений. В частности, можно ли сократить количество SQL-запросов? Ответы типа: "погугли вот такую вот систему для вывода менюшек" не котируются, т.к. хотелось самому попробовать.
Для небольших деревьев более быстрый вариант одним запросом получить все данные и затем просто их обработать
global $db; оно разве нужно здесь? безполезняк Код (Text): for($i=1; $i<$level; $i++) { echo ' '; } лучше Код (Text): echo str_repeat(" ", $level); Зачем mysqli_fetch_assoc, если есть mysqli_fetch_all вроде как. И опять же сочетание процедруного стиля и объектного не кошерно. Переписать. и да сделай всё в один/два запроса, как runner говорил