Вывод древовидных структур
Для оптимизации процесса я разбил алгоритм на две функции, первая — функция вызова, вторая — функция получения «потомков» объекта, идентификатор которого передается через параметры функции.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function show_three($V) { $V['pid'] = 0; // это означает, что «дерево» будет отображаться с самого первого уровня $body = ' <style> .level_0 { padding-left: 10px; } .level_1 { padding-left: 20px; } .level_2 { padding-left: 30px; } .level_3 { padding-left: 40px; } .level_4 { padding-left: 50px; } </style> <br> '.get_child($V); return $body; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | function get_child($V) { // Получаем все элементы которые являются «наследниками» текущего элемента $sql = 'SELECT * FROM `categoryes` WHERE `pid` = "'.$V['pid'].'"'; $result = mysql_query($sql); if(@mysql_num_rows($result)>=1) { while($list = mysql_fetch_array($result)) { // Переменной $V['pid'] переприсваивается идентификатор текущего элемента $V['pid'] = $list['id']; $body .= '<span class="level_'.$list['level'].'">'.$list['title'].' </span><br>'.get_child($V); } } return $body; } |
Структура и данные БД «categoryes»

id — идентификатор, ключевое поле;
pid — идентификатор «родителя»;
title — название категории;
level — уровень вложенности, необязательное поле, но для более легкого представления данных — рекомендую;
Результат:

Опять-таки рекурсия, чтобы я без нее делал :)
Похожие записи:
- Регистрация в поисковых системах
- К десятилетию Лента.ру заговорила по-пацански
- Комментирование в один клик
- Провокация прошла успешно
- Аренда новой квартиры
Метки: «PR» , «Ru» , «Pid» , «Body Level»
Опубликовано 29 апреля 2009 года в категории «Кодим на PHP вместе»

Николай
мая 2, 2009 8:37 дпВ текущем случае рекурсия, с точки зрения производительности — зло.
Попробуйте протестировать Ваш пример в реальном приложении и посмотрите на время выполнения скрипта =)
Executor
мая 4, 2009 6:09 ппВы правы, но отчасти. Построение дерева «меняется» только в случае обновления элементов данного дерева. В принципе можно кэшировать результат и обновлять кэш во время изменений, но это имеет место когда записей очень много, а изменения редки.
Спасибо за Ваше замечание.
Роман
мая 22, 2009 10:04 ппИМХО, лучше вытащить все данные из БД одним запросом, а потом строить дерево рекурсией. А то получается на каждую запись по запросу))