Дерево каталога

29 Июля 2021 23:39

Таблица в базе данных

+--+-------------+--------+
|id|name         |parentid|
+--+-------------+--------+
|1 |Имя раздела 1|0       |
|2 |Имя раздела 2|0       |
|3 |Имя раздела 3|1       |
|4 |Имя раздела 4|2       |
|5 |Имя раздела 5|4       |
|6 |Имя раздела 6|2       |
+--+-------------+--------+

Массив, полученный после выборки из базы

$arr = array(
    array(
        'id' => '1',
        'name' => 'Имя раздела 1',
        'parentid' => '0'
    ),
    array(
        'id' => '2',
        'name' => 'Имя раздела 2',
        'parentid' => '0'
    ),
    array(
        'id' => '3',
        'name' => 'Имя раздела 3',
        'parentid' => '1'
    ),
    array(
        'id' => '4',
        'name' => 'Имя раздела 4',
        'parentid' => '2'
    ),
    array(
        'id' => '5',
        'name' => 'Имя раздела 5',
        'parentid' => '4'
    ),
    array(
        'id' => '6',
        'name' => 'Имя раздела 6',
        'parentid' => '2'
    ),
);

Функция построения дерева

<?php

function form_tree($mess)
{
    if (!is_array($mess)) {
        return false;
    }
    $tree = array();
    foreach ($mess as $value) {
        $tree[$value['parentid']][] = $value;
    }
    return $tree;
}

//$parent_id - какой parentid считать корневым
//по умолчанию 0 (корень)
function build_tree($cats, $parent_id)
{
    if (is_array($cats) && isset($cats[$parent_id])) {
        $tree = '<ul>';
        foreach ($cats[$parent_id] as $cat) {
            $tree .= '<li>' . $cat['name'];
            $tree .= build_tree($cats, $cat['id']);
            $tree .= '</li>';
        }
        $tree .= '</ul>';
    } else {
        return false;
    }
    return $tree;
}