@iwebber

Обработка дерева категорий?

Здравствуйте, есть таблица с категориями( ее структура на картинке ).
2a212ffc46a44b310424205d10a1ee7c.png
Построить само дерево исходя из id и parent_id у меня получилось:
function getCats($res){
    $levels = array();
    $tree = array();
    $cur = array();
 
    foreach($res as $rows){
        $cur = &$levels[$rows['id']];
        $cur['parent_id'] = $rows['parent_id'];
        $cur['title'] = $rows['title'];
       
        if($rows['parent_id'] == 0){
            $tree[$rows['id']] = &$cur;
        }
        else{
            $levels[$rows['parent_id']]['children'][$rows['id']] = &$cur;
        }  
    }
    return $tree;
}
 function getTree($arr, $nl = 1, $nr = 0){
    $out = '';
 
    $out .= '<ul>';
    foreach($arr as $k=>$v){
        $out .= '<li>'.$v['title'].' - id : '.$k.' - pid : '.$v['parent_id']."</li><li>nl : ".$nl." - nr : ".$nr."</li>";
        if(!empty($v['children'])){
            $out .= getTree($v['children'], $nl, $nr);
        }
    }
    $out .= '</ul>';
    return $out;
}
    
$cats = getCats($array); 
echo getTree($cats);
Немного исправленные функции, найденные в интернете.

Столбцы NSLeft и NSRight в таблице заполнены правильно, но давайте представим, что они пусты.
Как раз воспроизвести их значения для каждой из категорий у меня не получается.
Если кто то поможет буду крайне признателен.
  • Вопрос задан
  • 3264 просмотра
Пригласить эксперта
Ответы на вопрос 2
alekciy
@alekciy
Вёбных дел мастер
В данном пример смешали 2 модели хранения дерева в реляционной базе:
1) id-paraent_id - cписок смежных вершин (Adjacency List)
2) NSLeft и NSRight - вложенные множества (Nested Set)

Почитать можно тут: "Иерархические структуры да...".

Соль в данном случае в том, что Nested Set менее устойчив к ошибкам, чем Adjacency List. Поэтому если "NSLeft и NSRight ... они пусты", то дерево разваливается. Поэтому "воспроизвести их значения для каждой из категорий" и не получится. Для этого нужно дерево восстановить используя данные из Adjacency List дерева. После починки дерева выборку из Nested Set можно делать общепринятыми запросами (по ссылке выше читать).
Ответ написан
Комментировать
@iwebber Автор вопроса
@alekciy, как раз значения NSLeft / NSRight на сайте и сломались.

Наверно, изначально не точно сформулировал вопрос, но я и хочу "дерево восстановить используя данные из Adjacency List дерева.", что сделать не выходит.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы