xandeadx.ru Блог музицирующего веб-девелопера

PHP → Выводим дерево Adjacency List

Опубликовано в

Пример функции, которая выводит список смежности в виде вложенных ul/li:

Дерево

/**
 * Возвращает html код дерева
 * @param  array    $tree - массив в формате array(array('name' => .., 'id' => .., 'pid' => ..), array(..))
 * @param  integer  $pid - id родителя
 */
function get_tree($tree, $pid)
{
    $html = '';
 
    foreach ($tree as $row)
    {
        if ($row['pid'] == $pid)
        {
            $html .= '<li>' . "\n";
            $html .= '    ' . $row['name'] . "\n";
            $html .= '    ' . get_tree($tree, $row['id']);
            $html .= '</li>' . "\n";
        }
    }
 
    return $html ? '<ul>' . $html . '</ul>' . "\n" : '';
}

Использование:

$tree = array(
    array('name' => 'Уровень 1',     'id' => 1,  'pid' => 0),
    array('name' => 'Уровень 1.1',   'id' => 2,  'pid' => 1),
    array('name' => 'Уровень 1.2',   'id' => 3,  'pid' => 1),
    array('name' => 'Уровень 1.3',   'id' => 4,  'pid' => 1),
    array('name' => 'Уровень 2',     'id' => 5,  'pid' => 0),
    array('name' => 'Уровень 2.1',   'id' => 6,  'pid' => 5),
    array('name' => 'Уровень 2.2',   'id' => 7,  'pid' => 5),
    array('name' => 'Уровень 3',     'id' => 8,  'pid' => 0),
    array('name' => 'Уровень 3.1',   'id' => 9,  'pid' => 8),
    array('name' => 'Уровень 3.1.1', 'id' => 10, 'pid' => 9),
    array('name' => 'Уровень 3.1.2', 'id' => 11, 'pid' => 9),
);
 
echo get_tree($tree, 0);
Похожие записи

Комментарии RSS

Спосибо, с такой проблемой встречался и буду встречатся, для вывода словаря очень нужно

Спасибо! Использую для динамической навигации по разделам сайта.

Не очень понимаю зачем это нужно? Если у вас статические страницы, можна использовать систему меню, если динамические views. Буду благодарна за пояснение.

Прошу прощения - не увидела что вышеуказанная статья актуальна для PHP, а не для Drupal.

Возможно ли таким способом вывести комментарии в древовидной структуре?

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

Спасибо, а то всюду реализовано в не менее чем 80 строк кода

есть существенный минус в этом, в коде выбрасываются пустые теги

    , можно поступить практичнее.. проверять вызывается функция в пустую или нет

    function get_tree($tree, $pid)
    {
        $html = '<ul>' . "\n";
    	$ul = false;
        foreach ($tree as $row)
        {
            if ($row['pid'] == $pid)
            {
                $html .= '	<li>' . "\n";
                $html .= '	' . $row['name'] . "\n";
                $html .= '		' . get_tree($tree, $row['id']);
                $html .= '	</li>' . "\n";
    			$ul = true;
            }
     
        }
     
        $html .= '</ul>' . "\n";
     $html = ($ul) ? $html : "";
        return $html;
    }

    спасибо, добавил в код

    Как прикрутить к семерке если взять вместо массива $tree запрос из бд на обход всех записей из таблицы , где выводится name&

    обойти результат запроса, собрать $tree, передать в функцию

    Спасибо большое. От себя добавлю, что можно прикрутить в конце каждого использованного элемента unset(), чтобы сократить число последующих итераций.

    подскажите а как такое зделать в форме select ? если можно примером

    Оставить комментарий

    Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
    • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
    • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
    • Строки и параграфы переносятся автоматически.
    • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

    Подробнее о форматировании