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

12.09.2010

Пример функции, которая выводит список смежности в виде вложенных 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);
Похожие записи

Комментарии

AlexStyle
13.09.2010, 12:08

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

Димок
16.09.2010, 06:55

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

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

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

Гость
03.10.2010, 20:59

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

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

Гость
03.10.2010, 22:58

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

Гость
18.09.2011, 20:05

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

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

    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, передать в функцию

    radiocity
    22.04.2014, 19:45

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

    Гость
    11.05.2014, 23:13

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

    Добавить комментарий