Forum Webscript.Ru

Программирование => Теория, алгоритмы и стандарты => Тема начата: bhor от 24 Марта 2003, 15:10:23

Название: Создание много уровневой структуры. Как организовать?
Отправлено: bhor от 24 Марта 2003, 15:10:23
есть таблица в mysql`е: id,parent,name
покажу на примере.
id=1
parent=-1
name=мясо

id=2
parent=1
name=куры

id=3
parent=2
name=бройлеры

вывод должен быть таким
мясо
 куры
  бройлеры

уровней может быть до бесконечности. помогите написать цикл
Название: Создание много уровневой структуры. Как организовать?
Отправлено: Xander от 24 Марта 2003, 15:23:24
Я такую штуку делал. Если хочешь - скину исходник, может найдешь тама что полезное.
Название: Создание много уровневой структуры. Как организовать?
Отправлено: bhor от 24 Марта 2003, 15:26:10
на
andrew|@|webscript.ru
Название: Создание много уровневой структуры. Как организовать?
Отправлено: bhor от 24 Марта 2003, 15:29:57
Впринципе пример у меня есть. но такой накрученный(делался под сайт компутерного магазина) разобраться в нем невозможно.
хотелось бы посмотреть на чистый код.  Или алгоритм как это сделать.
Название: Создание много уровневой структуры. Как организовать?
Отправлено: Xander от 24 Марта 2003, 15:43:31
bhor
Из того, что я тебе прислал - смотри table2tree.php.
Этот как раз оно.
Название: Создание много уровневой структуры. Как организовать?
Отправлено: USE от 24 Марта 2003, 15:44:18
Xander, а всем показать не хочешь? мне, например, интересно посмотреть на решение. или скрипт скрывается за копирайтом? ;-)
Название: Создание много уровневой структуры. Как организовать?
Отправлено: Xander от 24 Марта 2003, 15:50:42
USE
магистры с тобой %)
просто я сам забыл, как делал, а оказалось что там кусочек совсем маленький:

function PrintIt($res) {
$name = $res[\'name\'];
$alias = $res[\'alias\'];
echo "
  • $name";
    }
    function GetNode($id,$proceed,$isRecursive=1) {
    global $query_counter;
    echo "
      ";
      if ($id == \'NULL\') {
      $query = "SELECT * FROM dispatch WHERE parentid IS NULL";
      } else {
      $query = "SELECT * FROM dispatch WHERE parentid=$id";
      }
      $result = mysql_query($query);
      $query_counter++;
      if (mysql_num_rows) {
      while ($row = mysql_fetch_assoc($result)) {
      call_user_func($proceed,$row);
      GetNode($row[\'id\'],$proceed);
      }
      }
      echo "
    ";
    }
    //GetNode(\'NULL\',\'PrintIt\');
  • Название: Создание много уровневой структуры. Как организовать?
    Отправлено: USE от 24 Марта 2003, 16:01:14
    да прибудет с тобой сила Xander, полезный это кусочек ;-) понравился очень и просто и работает. можно использовать его? ;-)
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Xander от 24 Марта 2003, 16:08:17
    USE
    Если ты уверен в том, что делаешь - то на здоровье.
    А то там могут быть глюки. Ежели наши PHP-гуру добро дадут...
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: bhor от 24 Марта 2003, 17:25:22
    Xander
    Спасибо. то что надо. работает усё
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: USE от 24 Марта 2003, 17:45:03
    Цитировать
    Xander:
    Если ты уверен в том, что делаешь - то на здоровье.

    нужна была идея, а ты ее дал - это самое главное, теперь у меня начала работать карта сайта ;-)

    спасибо, кстати.
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Xander от 24 Марта 2003, 18:03:26
    2moderators: а перекиньте ветку в Алгоритмы. Там она гораздо уместнее будет.
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Maniac от 24 Марта 2003, 18:23:29
    Господа, не хочу быть ложкой дёгтя в бочке райского наслаждения, но не кажется ли Вам, что от такого кода загнется SQL-сервер? (я про количество запросов). В MP 1.5.x я подобную задачу решил несколько по-иному ($section - строка из БД с описанием текущего раздела):


    $query=$db->query("SELECT * FROM $table_sections WHERE 1 ORDER BY sort ASC");
    $parent_array=array();
    foreach($tmp as $line)
    $parent_array[$line[\'sid\']]=array($line[\'parent\'],$line[\'snamr\'],$line[\'sname\']);

    $parent=$section[\'parent\'];
    while($parent!=0)
    {
    $nav_array[]=array($parent_array[$parent][1],$parent_array[$parent][2]);
    $parent=$parent_array[$parent][0];
    }
    У меня верхний parent - 0
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Макс от 24 Марта 2003, 19:22:02
    [off] ну а я в который уже раз напомню, что деревья, которые сравнительно редко меняют свою структуру лучше хранить по алгоритму Nested Sets, позволяющему за 1-2 запроса получить почти любой фрагмент дерева. http://dev.e-taller.net/dbtree
    Хотя мне известен один древовидный форум с 30 000 сообщений успешно работающий и хранящий дерево сообщений по этому алгоритму. [/off]
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: ThE0ReTiC от 24 Марта 2003, 23:04:18
    Цитировать
    деревья, которые сравнительно редко меняют свою структуру

    позволю усомниться, что система, типа форума, относится к данному классу деревьев [off]могу ошибаться...[/off]
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Макс от 25 Марта 2003, 01:00:06
    ThE0ReTiC
    согласен. Я бы  для форума этот алгоритм не рискнул использовать (хотя после того как пообщался с автором данного форума я еще подумаю).
    Там просто структура дерева находится в одной таблице (из 4 int-полей) а данные во второй - связанные со структурой по первичному ключу. Поэтому если в дерево нужно внести новый элемент, изменяется только первая таблица (изменения происходят быстро благодаря тому что таблица имеет фиксированную длинну и всего один индекс).
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: AlieN от 25 Марта 2003, 04:21:56
    Цитировать
    ThE0ReTiC:
    могу ошибаться...

    древние форумы аля
    forum.myweb.ru [OFF]сори за рекламу[/OFF] именно такие

    ЗЫ: [OFF]где фотки?[/OFF]
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: ThE0ReTiC от 25 Марта 2003, 10:15:14
    Цитировать
    где фотки?

    в этот раз их не было...
    приезжай в след раз - привози фотоаппарат - будут фотки :)
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: я... от 25 Марта 2003, 12:47:54
    ThE0ReTiC, в форумах обычно фиксированная вложенность "дирректорий"... а тут речь идет о "бесконечной"...
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Xander от 25 Марта 2003, 12:49:34
    я...
    да ладно?
    В приличных древовидных форумах никаких ограничений вложенности кроме модераторов имхо не бывает.
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: ThE0ReTiC от 25 Марта 2003, 12:53:20
    я...
    потом надо учесть высокодинамичное поведение листьев (посты) и веток (темы), близких к конечному
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: я... от 25 Марта 2003, 12:57:13
    Xander, пример, плз...
     
    ThE0ReTiC, но это уже, пожалуй, к конкретной задаче...
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Xander от 25 Марта 2003, 13:39:22
    Да хотя бы http://www.forum.veresk.ru/
    Где там ограничение вложенности?
    Или wtboard.
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: я... от 25 Марта 2003, 13:53:41
    Xander, это нерациональные исключения...
    при большой загрузке деревья будут долго генерироваться...
    [OFF]Еще...при большой загрузке ими будет просто неудобно пользоваться...[/OFF]
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Xander от 25 Марта 2003, 13:55:36
    я...
    Спорить не буду. Но форумы есть и они вполне хорошие. Кстати wtboard\'у на нагрузку пофигу, потому что он работает на статике.
    Название: Создание много уровневой структуры. Как организовать?
    Отправлено: Stas от 08 Апреля 2003, 12:45:24
    v bolee serioznyh impelemtatsiah eto delaetsia s pomoshiu SQL... V oracle est\' CONNECT BY PRIOR

    http://www.arrowsent.com/oratip/tip40.htm

    Vstrechnyi vopros, nikto ne znaet esli v MySQL takaia anlogia est\' ili budet podderzhivatsa naprimer v 4.1 ??