Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм вывода дерева рекурсией, !запрос из базы один! 
V
    Опции темы
AXS
Дата 20.4.2010, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 115
Регистрация: 26.9.2008
Где: РК

Репутация: нет
Всего: -1



В общем сначала небольшой код:
Код

<?php    
    // Значения всегда отсортированы сначала по PID потом по ID
    $nod[1] = array('pid'=>0, 'id'=>1, 'val'=>'1--0-1', 'a'=>0);
    $nod[2] = array('pid'=>0, 'id'=>2, 'val'=>'2--0-2', 'a'=>0);
    $nod[3] = array('pid'=>0, 'id'=>3, 'val'=>'3--0-3', 'a'=>0);
    $nod[4] = array('pid'=>0, 'id'=>6, 'val'=>'4--0-6', 'a'=>0);
    $nod[5] = array('pid'=>1, 'id'=>4, 'val'=>'5--1-4', 'a'=>0);
    $nod[6] = array('pid'=>1, 'id'=>5, 'val'=>'6--1-5', 'a'=>0);
    $nod[7] = array('pid'=>2, 'id'=>7, 'val'=>'7--2-7', 'a'=>0);
    $nod[8] = array('pid'=>3, 'id'=>8, 'val'=>'8--3-8', 'a'=>0);
    $nod[9] = array('pid'=>3, 'id'=>9, 'val'=>'9--3-9', 'a'=>0);
    $nod[10] = array('pid'=>3, 'id'=>10, 'val'=>'10--3-10', 'a'=>0);
    $nod[11] = array('pid'=>10, 'id'=>11, 'val'=>'11--10-11', 'a'=>0);

    function fill_node($nom) {
        global $nod;
        $p = $nod[$n]['pid'];
        $n = $nom;
        // Проделать следующее со всеми элементами имеющими текущий PID
        while (($nod[$n]['pid'] == $p)) {
            print $nod[$n]['val'].'<br>';
            $nod[$n]['a']=1;
            // Найти элемент с PID = ID текущего элемента и повторить рекурсию
            for($x=1; $x<count($nod); $x++) {
                if(($nod[$x]['pid'] == $nod[$n]['id']) && ($nod[$x]['a'] == 0)) {
                    fill_node($x);
                }
            }
            $n++;
        }
    }

    fill_node(1);
?>


Как бы объясняя код: Запрос из БД делается ОДИН, после чего данные упаковываются в массив. Здесь чтобы не нагромождать код, я данные поместил в массив вручную.
Потом уже из МАССИВА рекурсивно строим дерево:

Выводить будем поле $nod[$x]['val'] являющееся строчкой из трёх цифр
Первая цифра в строчке - позиция в массиве-хранилище $nod (напр. 6--1-5 хранится в $nod[6]['val'])
Вторая - ID родительской ветки (PID)
Третья - свой ID

По идее должно получиться: 
Код

1--0-1
    5--1-4
    6--1-5
2--0-2
    7--2-7
3--0-3
    8--3-8
    9--3-9
    10--3-10
        11--10-11
4--0-6

Правда без отступов. Здесь они для отображения иерархии....
Но вот получается: 
Код

1--0-1
2--0-2
3--0-3
4--0-6

То есть такое ощущение, что функция не может выполнить или вызвать саму себя... Почему?

Добавлено через 3 минуты и 12 секунд
Ааааааа...

Добавлено через 5 минут и 24 секунды
Извиняюсь - не увидел простые ошибки:
Вместо 
Код

$p = $nod[$n]['pid'];
 должно быть 
Код

$p = $nod[$nom]['pid'];

и вместо  
Код

for($x=1; $x<count($nod); $x++) {
 - 
Код

for($x=1; $x<=count($nod); $x++) {

Всё оказывается работает!
--------------------
<><><> AXS - Live Organizer v1.0  <><><> 0_o
PM MAIL WWW ICQ Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0399 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.