Добрый день. С точки зрения работоспособности работает на ура, строит правильные списки <ul><li>, нареканий нет, но такое ощущение, что я перемудрил, и есть гораздо проще решение, поэтому прошу взглянуть трезвым взглядом. Во первых не нравиться запрос в цикле, он и больше всех и раздражает.... Во вторых, просто не нравиться, громоздко слишком. Таблицы // NESTED SETS (категории) | id | parent_id | name | tree_left | tree_right | tree_level | // Страницы | id | cat_id | name | sort | PHP: <?php // Сама функция построения списков function ISMmenu() { global $dbInit, $settings_table; $retMenu = ''; $menu = ''; // Считываем какое меню у нас установлено $query_menu = " SELECT pos_menu FROM " . $settings_table['settings_menu'] . " ORDER BY id LIMIT 1 "; if ($row_menu = $dbInit -> get_row($query_menu)) { $current_level = 0; $pos_menu = $row_menu -> pos_menu; $query_cat = " SELECT * FROM " . $settings_table['page_cat'] . " ORDER BY parent_id, tree_left "; if ($rows_pageCat = $dbInit -> get_results($query_cat)) { $retMenu .= '<ul id = "navDropTopMenu">'; foreach ($rows_pageCat as $row_pageCat) { $cat_id = intval($row_pageCat -> id); $cat_name = '<a href = "">' . htmlspecialchars_decode($row_pageCat -> name) . ' »</a>'; $tree_left = intval($row_pageCat -> tree_left); $tree_right = intval($row_pageCat -> tree_right); $tree_level = intval($row_pageCat -> tree_level); if ($tree_level === $current_level) { $retMenu .= '<li>' . $cat_name; } else if ($tree_level > $current_level) { $retMenu .= '<ul><li>' . $cat_name; $current_level++; } $query_page = " SELECT id, link, name FROM " . $settings_table['pages'] . " WHERE approved = 'Yes' AND cat_id = " . $cat_id . " ORDER BY sort "; if ($rows_page = $dbInit -> get_results($query_page)) { if ($tree_level === $current_level) { $retMenu .= '<ul>'; } foreach ($rows_page as $row_page) { $id = intval($row_page -> id); $name = htmlspecialchars_decode($row_page -> name); if ($tree_level < $current_level) { $menu = '<ul><li><a href = "#">' . $name . '</a></li></ul>'; } else { $retMenu .= '<li><a href = "#">' . $name . '</a></li>'; } } if ($tree_level === $current_level) { $retMenu .= '</ul>'; } } if ($tree_level === $current_level && $tree_right - $tree_left === 1) { $retMenu .= '</li>'; } else if ($tree_level < $current_level) { $retMenu .= '</ul></li><li>' . $cat_name . $menu . '</li>'; $current_level--; } } $retMenu .= '</ul>'; } } else { return LANG_ERROR_NOMENUPOS; } return $retMenu; }
мда, для начала можно убрать половину лишних пустых строк, кода убудет в 2 раза запрос в цикле это плохо, значит либо БД неправельно спроектирована, либо нужно где применить объединение таблиц (скорее всего LEFT JOIN), либо кешировать какие-то таблицы, у меня например кешируются категории... Чтобы можно было написать больше, неплохо было бы хорошо прокоментировать код...