<? Блог php-программиста ?>

?????? - ??????? ? ??????.
  • Чтение блога

Вывод древовидных структур

Для оптимизации процесса я разбил алгоритм на две функции, первая — функция вызова, вторая — функция получения «потомков» объекта, идентификатор которого передается через параметры функции.

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»
2904

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

Результат:
29042

Опять-таки рекурсия, чтобы я без нее делал :)

Похожие записи:

Метки: «» , «» , «» , «»

Опубликовано 29 апреля 2009 года в категории «Кодим на PHP вместе»

Комментарии (3)

  1. Николай
    мая 2, 2009 8:37 дп

    В текущем случае рекурсия, с точки зрения производительности — зло.
    Попробуйте протестировать Ваш пример в реальном приложении и посмотрите на время выполнения скрипта =)

  2. Executor
    мая 4, 2009 6:09 пп

    Вы правы, но отчасти. Построение дерева «меняется» только в случае обновления элементов данного дерева. В принципе можно кэшировать результат и обновлять кэш во время изменений, но это имеет место когда записей очень много, а изменения редки.
    Спасибо за Ваше замечание.

  3. Роман
    мая 22, 2009 10:04 пп

    ИМХО, лучше вытащить все данные из БД одним запросом, а потом строить дерево рекурсией. А то получается на каждую запись по запросу))


www.liex.ru - ?????????????? ?????????? ?????? ? ??????? ????????