Ситуация такая пишу небольшой сайт, вернее что то типа каталога товаров.
Так вот есть база данных, в ней таблица с группами товаров. Мне нужно вывести дерево каталогов. Честно говоря не понимаю логику как это делать? Может кто то мне разъяснить как это можно организовать.
Таблица с группами: group_wares
В ней есть поля:
code_group_wares - код группы
code_parent_group_wares - код родительской группы
name - название группы
Я понимаю что это нужно делать с помощью рекурсии, но я с рекурсиями никогда еще не сталкивался и не имею особого опыта их писать
Спустя 7 минут, 40 секунд (15.04.2011 - 14:43) Игорь_Vasinsky написал(а):

Спустя 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) Пишешь функцию рекурсивного построения(вывода)
5) У тебя имеется какой то условный элемент - "корень", например 0. Запускаешь функцию printthree с ним как с аргументом:
В общем типа так, тегу div задай margin-left для наглядности
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?

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

А вообще каким образом в функцию попадет массив $a ты не указал. global рать его?
Спустя 26 минут, 44 секунды (15.04.2011 - 16:40) Michael написал(а):
Цитата (Raito-kun @ 15.04.2011 - 14:55) |
Michael, ты имел ввиду tree? ![]() |
типа того
код чисто схематически набросал естественно, демонстрация принципа, остальное догонять самому.
Спустя 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