В общем сначала небольшой код:| Код | <?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[$nom]['pid'];
|
и вместо | Код | for($x=1; $x<count($nod); $x++) {
|
- | Код | for($x=1; $x<=count($nod); $x++) {
|
Всё оказывается работает! |