@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 в таблице заполнены правильно, но давайте представим, что они пусты.
Как раз воспроизвести их значения для каждой из категорий у меня не получается.
Если кто то поможет буду крайне признателен.
  • Вопрос задан
  • 3260 просмотров
Пригласить эксперта
Ответы на вопрос 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 дерева.", что сделать не выходит.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 12:23
2500 руб./за проект
25 апр. 2024, в 12:21
10000 руб./за проект