Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Многоуровневое меню со списками UL LI
 
 автор: web777   (23.12.2008 в 09:37)   письмо автору
 
 

Здравствуйте, решил написать скрипт вывода разделов, с выпадающей веткой текущего раздела. Реализовал таким образом.

Рекурсивная функция

<?php
function ShowTree($ParentID$lvl) {
    global 
$tree;
    if (!isset(
$tree[$ParentID])) return;
    
$indent str_repeat('  '$lvl);
    echo 
$indent."<ul>\n";
    foreach(
$tree[$ParentID] as $item) {
         echo 
$indent.'  <li><a href="?ID='.$item["id"]."\">".$item["name"]."</a></li>\n";
        
ShowTree($item["id"], $lvl+1);
    }
    echo(
$indent."</ul>\n");
}
?>



Здесь получаем список разделов

<?php
$tree 
= array();

<?
php $sql_result $db->q("SELECT `id`,`name`,`parent` FROM " PREFIX "cat  where parent IN(0,1,2,7,54) ");

while(
$row $db->mysql_assoc($sql_result)){
   
$tree[$row['parent']][] = $row;
}

ShowTree(00);
?>


в запросе мы указываем IN(0,1,2,7,54) , где 0,1,2,7,54 номера Parent, сделал для того чтобы не помещать весь список из таблицы, а ограничился только теми разделами, которые нужно вывести.

Таким образом мы не забиваем массив $tree всеми подразделами что находятся в данной таблице, что могло бы случится если допустим было 500-1000 подразделов, массив просто был бы огромным.

Недостаток только в одном, - вычислить значения Parent`а для текущей ветки.

Ниже приведу несколько примеров выбора разделов



при запросе
<?php $sql_result $db->q("SELECT `id`,`name`,`parent` FROM " PREFIX "cat where parent IN(0,1,3,13) "); ?>

получаем

<ul>
  <li><a href="?ID=1">Россия</a></li>
  <ul>
    <li><a href="?ID=2">Москва</a></li>
    <li><a href="?ID=3">Санкт-Питербург</a></li>
    <ul>
      <li><a href="?ID=9">Невский</a></li>

      <li><a href="?ID=10">Петроградский</a></li>
      <li><a href="?ID=11">Авиамоторный</a></li>
      <li><a href="?ID=13">Автово</a></li>
    </ul>
    <li><a href="?ID=4">Новосибирск</a></li>
    <li><a href="?ID=5">Кемерово</a></li>

    <li><a href="?ID=42">Томск</a></li>
    <li><a href="?ID=41">Омск</a></li>
  </ul>
  <li><a href="?ID=14">Германия</a></li>
  <li><a href="?ID=15">Австрия</a></li>
  <li><a href="?ID=16">США</a></li>

  <li><a href="?ID=58">Япония</a></li>
  <li><a href="?ID=59">Франция</a></li>
  <li><a href="?ID=60">Банког</a></li>
  <li><a href="?ID=61">Грузия</a></li>
</ul>





при запросе
<?php $sql_result $db->q("SELECT `id`,`name`,`parent` FROM " PREFIX "cat where parent IN(0,15,62) "); ?>

получаем

<ul>
  <li><a href="?ID=1">Россия</a></li>
  <li><a href="?ID=14">Германия</a></li>
  <li><a href="?ID=15">Австрия</a></li>
  <ul>
    <li><a href="?ID=62">Сочи</a></li>
  </ul>

  <li><a href="?ID=16">США</a></li>
  <li><a href="?ID=58">Япония</a></li>
  <li><a href="?ID=59">Франция</a></li>
  <li><a href="?ID=60">Банког</a></li>
  <li><a href="?ID=61">Грузия</a></li>
</ul>










при запросе
<?php $sql_result $db->q("SELECT `id`,`name`,`parent` FROM " PREFIX "cat where parent IN(0,1,2,7,54) "); ?>

получаем

<ul>
  <li><a href="?ID=1">Россия</a></li>
  <ul>
    <li><a href="?ID=2">Москва</a></li>
    <ul>
      <li><a href="?ID=6">Химки</a></li>
      <li><a href="?ID=7">Железнодорожный</a></li>

      <ul>
        <li><a href="?ID=54">Посёлок</a></li>
      </ul>
      <li><a href="?ID=8">Обнинск</a></li>
    </ul>
    <li><a href="?ID=3">Санкт-Питербург</a></li>
    <li><a href="?ID=4">Новосибирск</a></li>

    <li><a href="?ID=5">Кемерово</a></li>
    <li><a href="?ID=42">Томск</a></li>
    <li><a href="?ID=41">Омск</a></li>
  </ul>
  <li><a href="?ID=14">Германия</a></li>
  <li><a href="?ID=15">Австрия</a></li>

  <li><a href="?ID=16">США</a></li>
  <li><a href="?ID=58">Япония</a></li>
  <li><a href="?ID=59">Франция</a></li>
  <li><a href="?ID=60">Банког</a></li>
  <li><a href="?ID=61">Грузия</a></li>
</ul>


На всё про всё, уходит всего один запрос, при этом массив совсем небольшой, содержит только то что нужно вывести. И глубина вложенности при этом также может быть любой.

Всё это работает но только с поставлением вручную Parent`а хотелось бы чтобы автоматически.

Единственное что напрягает, это с вычислением Parent`а, как его определить чтобы не делать несколько запросов, Пока в голову пришла одна мысль создать дополнительную таблицу, где будят содержатся значения Parent`а примерно так

ID | var
1 | 0,1,2,7,54
2 | 0,15,62
3 | 0,1,3,13


в этом случаи не удобно будет то что при каждом изменении раздела, создании, перемещении,удалении нужно править эту таблицу.

Хотел спросить ваше мнение, как насчёт этой идеи вывода разделов, и может есть какие нибудь идеи по вычислению Parent с одним запросом?

ЗЫ: немного уточню насчёт отдельной таблицы, чтобы было понятнее, сделана она для того чтобы можно было обратится всего одним запросом для вычисления Parent`тов. Т.к если мы по пытаемся вычислить через основную таблицу, у нас как я полагаю с одним запросом не получится, нужно будет пройтись циклом от конечного раздела до корня (Parent=0), что получится запросов столько же сколько и уровней вложностей.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования