[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Обход дерева
apc
Всем привет.
Есть таблица в БД вида -
ID | ID_P |..........................................
(ID_P - айди родителя)
И вот записи могут быть зависимы друг от друга, т.е. есть запись (0 - это самое начало, глава ветки. Кол - во записей с ID_P = 0 не ограничено)
1 | 0
вторая запиь "потомок" первой
2 | 1 - id отца
Надеюсь принцып уловили.

Так вот мне надо как то обойти все записи о построить "дерево", но как.

Я придумал одно решение но оно не совершенно

я вначале делал в цыкле селект всех ID_P = 0 - т.е. это точка "отсчета"
вот в этом же цикле я делал еще один цикл который брал айди предидущего цикла и искал "потомков" с ID_P = данному айди. И в этом цикле еще один и т.д. Но это решение не является верным, так как кол-во "вложенности" зависит от кол-ва циклов.......
Помогуте!
Вот мой код
PHP
$this->db->query('SELECT * FROM pages WHERE page_parent = "0"');
    
$PArray $this->db->return_obj_array();
        for(
$i=0;$i<count($PArray);$i++, $array){
            
$ID $PArray[$i]['ID'];
        
/**********************************************************************/
                         
$this->db->query('SELECT * FROM pages WHERE page_parent = "'.$ID.'"');
                         
$UArray $this->db->return_obj_array();
                                     for(
$y=0;$y<count($UArray);$y++){
                                            
$ID2 $UArray[$y]['ID'];
                                    
/******************************************/
                                                 
$this->db->query('SELECT * FROM pages WHERE page_parent = "'.$ID2.'"');
                                                 
$TArray $this->db->return_obj_array();
                                                     for(
$t=0;$t<count($TArray);$t++){
                                                         
$ID3 $TArray[$y]['ID'];
                                                    
/******************************************/
                                                    
}



                                }


    }




Спустя 21 минута, 35 секунд (26.02.2009 - 17:55) sergeiss написал(а):
Не буду утверждать однозначно... Но тут, по-моему, просто "просится" функция.
Ежели надо, то вызываешь ее рекурсивно. То есть, функция вызывает сама себя, но уже с другими параметрами.
В твоем случае примерно так получается.
PHP
function one_leve( $IP )
{
  // тут сначала делаешь запрос данных одного уровня, для $IP 
 // далее по циклу проходишь по каждому элементу, вызывая  для него прямо отсюда 
//функцию one_level() c параметрами IP, дочерними для $IP

  one_level( $IP_son );

// когда дойдешь до конца, то просто выходишь из этой функции, и происходит возврат к предыдущему уровню 
//(может быть, на несколько ступеней вверх), где еще есть что выводить; 
//и так до тех пор, пока не пройдешь всё дерево
}


Надеюсь, я понятно выразился smile.gif Но ежели непонятно, то готов пояснить свою мысль.

На всякие случай, для наглядности, вот тебе работающий образец:
PHP
function tst $i )
{
    echo 
"Val = $i<br>";
    
    if( 
$i == ) return;
    
    
tst$i-);
}

tst10 );

Спустя 2 минуты, 30 секунд (26.02.2009 - 17:58) apc написал(а):
Можешь на примере показать =)) Или просто подробнее напиши.
Если не сложно.

Спустя 1 минута, 33 секунды (26.02.2009 - 17:59) sergeiss написал(а):
Цитата (apc @ 26.02.2009 - 17:58)
Можешь на примере показать =)) Или просто подробнее напиши.
Если не сложно.

Я уже в предыдущий ответ успел вставить примерчик smile.gif

Пример выведет
Val = 10
Val = 9
Val = 8
Val = 7
Val = 6
Val = 5
Val = 4
Val = 3
Val = 2
Val = 1
Val = 0

Спустя 10 минут, 1 секунда (26.02.2009 - 18:09) apc написал(а):
Цитата (sergeiss @ 26.02.2009 - 14:59)
Цитата (apc @ 26.02.2009 - 17:58)
Можешь на примере показать =)) Или просто подробнее напиши.
Если не сложно.

Я уже в предыдущий ответ успел вставить примерчик smile.gif

Пример выведет
Val = 10
Val = 9
Val = 8
Val = 7
Val = 6
Val = 5
Val = 4
Val = 3
Val = 2
Val = 1
Val = 0

сори, пример не заметил =))))
А на счет твоего решения не совсем понял, это вроде обход только ожной ветки

Спустя 12 минут, 18 секунд (26.02.2009 - 18:21) sergeiss написал(а):
Хорошо, давай распишу чуть подробнее, взяв за основу твой текст:

PHP
function one_level$id$tree_level )
{
$this->db->query('SELECT * FROM pages WHERE page_parent = "$id"');
    
$PArray $this->db->return_obj_array();
       echo 
"New ID level, parent = $id, tree_level=$tree_level<br>";
        for(
$i=0;$i<count($PArray);$i++, $array)
       {
            
$ID_new $PArray[$i]['ID'];
            echo 
"ID=$ID_new, ";
            
one_level$ID_new$tree_level+1);
       }
       echo 
"<br>";
}


Вызов делается одной строкой:
PHP
one_level(0,0);


Будет сделано следующее.
Функция сделает запрос в БД, получит список дочерних ID, и вызовет функцию one_level для каждой из них.
НО!!!! Внутри каждого вызова one_level этот процесс будет повторен, только в качестве родительского будет взят новый ID, переданный в качестве параметра. Там весь процесс будет повторен.
И так до тех пор, пока не будет пройдено всё дерево.

В распечатках, которые я вставил, будет выводиться как айди, так и номер уровня в дереве.

Спустя 2 часа, 21 минута, 55 секунд (26.02.2009 - 20:43) kirik написал(а):
Вот с точно такой же задачей разбирались smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.