[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с построением дерева на php
alavasters
Говорю сразу я новичок в программировании.
Ситуация такая пишу небольшой сайт, вернее что то типа каталога товаров.
Так вот есть база данных, в ней таблица с группами товаров. Мне нужно вывести дерево каталогов. Честно говоря не понимаю логику как это делать? Может кто то мне разъяснить как это можно организовать.
Таблица с группами: group_wares
В ней есть поля:
code_group_wares - код группы
code_parent_group_wares - код родительской группы
name - название группы

Я понимаю что это нужно делать с помощью рекурсии, но я с рекурсиями никогда еще не сталкивался и не имею особого опыта их писать



Спустя 7 минут, 40 секунд (15.04.2011 - 14:43) Игорь_Vasinsky написал(а):
blink.gif

Спустя 2 минуты, 49 секунд (15.04.2011 - 14:45) alavasters написал(а):
Если что тоне понятно написал, пишите постараюсь написать подробнее

Спустя 51 минута, 37 секунд (15.04.2011 - 15:37) Michael написал(а):
Тебе надо все дерево построить?

1) делаешь запрос SELECT id, idpar FROM ...
2) устанавливаешь вспомогательный массив $a = array();
3) пробегаешь циклом по результату запроса и на каждой итерации добавляешь данные в $a след. образом:
$a[$idpar][] = $id
Так получишь всю необходимую информацию о иерархии: Элемент -> его дети.
4) Пишешь функцию рекурсивного построения(вывода)
function printthree($el) {
if (isset($a[$el])) {
// имеет детей
echo $el;
echo '<div>';
foreach ($a[$el] as $val) {
printthree($val);
}
echo '</div>';
} else {
// лист дерева
echo $el;
}
}

5) У тебя имеется какой то условный элемент - "корень", например 0. Запускаешь функцию printthree с ним как с аргументом:
printthree(0);


В общем типа так, тегу div задай margin-left для наглядности

Спустя 18 минут, 18 секунд (15.04.2011 - 15:55) Raito-kun написал(а):
Michael, ты имел ввиду tree? biggrin.gif

Спустя 17 минут, 47 секунд (15.04.2011 - 16:13) Snus написал(а):
Цитата (Michael @ 15.04.2011 - 12:37)
// имеет детей

За такое посадить могут. biggrin.gif
А вообще каким образом в функцию попадет массив $a ты не указал. global рать его?

Спустя 26 минут, 44 секунды (15.04.2011 - 16:40) Michael написал(а):
Цитата (Raito-kun @ 15.04.2011 - 14:55)
Michael, ты имел ввиду tree? biggrin.gif

типа того

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

Спустя 35 минут, 28 секунд (15.04.2011 - 17:15) Snus написал(а):

Спустя 5 минут, 58 секунд (15.04.2011 - 17:21) alavasters написал(а):
Ну смотри данные я получаю из базы оракл запросом:
select gw.code_group_wares , gw.code_parent_group_wares, gw.name
from mz.group_wares gw
start with gw.code_group_wares = 2
connect by prior gw.code_group_wares = gw.code_parent_group_wares

А что с ним потом делать вообще не знаю

Спустя 10 минут, 49 секунд (15.04.2011 - 17:32) Игорь_Vasinsky написал(а):
так те выше показали пример рекурсии, как ты и хотел, что не понятного...

Спустя 35 минут, 45 секунд (15.04.2011 - 18:08) sergeiss написал(а):
Цитата (alavasters @ 15.04.2011 - 18:21)
Ну смотри данные я получаю из базы оракл запросом:

Посмотри сюда: http://phpforum.ru/index.php?showtopic=31806&hl= - возможно, что решение на Постгре тебе поможет подойти к решению твоей задачи.

В моем запросе используется специфика Постгре... Судя по тому, что я нашел в и-нете, в Оракле есть такая же хрень, под названием WITH. То есть, ты сможешь построить рекурсивный запрос аналогично тому, как это сделал я в Постгре.

PS. Например, тут есть на эту же тему: http://www.oracle-base.com/articles/misc/WithClause.php
Быстрый ответ:

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