Дерево

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Дерево

Сообщение futbolim »

Нужны категории до 5-ти уровней вложенной. Какой алгоритм позволяет выбирать всю ветку?
Например:
Категория11
-Категория21
--Категория31
--Категория32
---Категория41
---Категория42
---Категория43
----Категория51
----Категория52
--Категория33
-Категория22
Категория12
-Категория23
-Категория24

Нужно выбрать всю ветку (одним запросом реально?):
Категория11
-Категория21
--Категория31
--Категория32
---Категория41
---Категория42
---Категория43
----Категория51
----Категория52
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Дерево

Сообщение samdark »

Nested set.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Дерево

Сообщение futbolim »

Спасибо. Получилось. Выбирается. Вопрос.
Выбирается одним уровнем. Теперь мне нужно самому сортировать по depth Чтобы массив получился в виде дерева?
Выбирается так:

Код: Выделить всё

[
    0 => [
        'id' => 13,
        'lft' => 2,
        'rgt' => 15,
        'depth' => 1,
        'name' => 'Категория 11',
    ],
    1 => [
        'id' => 16,
        'lft' => 3,
        'rgt' => 10,
        'depth' => 2,
        'name' => 'Категория 21',
    ],
    2 => [
        'id' => 19,
        'lft' => 4,
        'rgt' => 5,
        'depth' => 3,
        'name' => 'Категория 31',
    ],
    3 => [
        'id' => 20,
        'lft' => 6,
        'rgt' => 7,
        'depth' => 3,
        'name' => 'Категория 32',
    ],
    4 => [
        'id' => 21,
        'lft' => 8,
        'rgt' => 9,
        'depth' => 3,
        'name' => 'Категория 33',
    ],
    5 => [
        'id' => 17,
        'lft' => 11,
        'rgt' => 12,
        'depth' => 2,
        'name' => 'Категория 22',
    ],
    6 => [
        'id' => 18,
        'lft' => 13,
        'rgt' => 14,
        'depth' => 2,
        'name' => 'Категория 23',
    ],
    7 => [
        'id' => 14,
        'lft' => 16,
        'rgt' => 17,
        'depth' => 1,
        'name' => 'Категория 12',
    ],
    8 => [
        'id' => 15,
        'lft' => 18,
        'rgt' => 19,
        'depth' => 1,
        'name' => 'Категория 13',
    ]
];
А хочется так:

Код: Выделить всё

[
    0 => [
        'id' => 13,
        'lft' => 2,
        'rgt' => 15,
        'depth' => 1,
        'name' => 'Категория 11',
        'children' => [
            0 => [
                'id' => 16,
                'lft' => 3,
                'rgt' => 10,
                'depth' => 2,
                'name' => 'Категория 21',
                'children' => [
                    0 => [
                        'id' => 19,
                        'lft' => 4,
                        'rgt' => 5,
                        'depth' => 3,
                        'name' => 'Категория 31',
                    ],
                    1 => [
                        'id' => 20,
                        'lft' => 6,
                        'rgt' => 7,
                        'depth' => 3,
                        'name' => 'Категория 32',
                    ],
                    2 => [
                        'id' => 21,
                        'lft' => 8,
                        'rgt' => 9,
                        'depth' => 3,
                        'name' => 'Категория 33',
                    ],
                ]
            ],
            1 => [
                'id' => 17,
                'lft' => 11,
                'rgt' => 12,
                'depth' => 2,
                'name' => 'Категория 22',
            ],
            2 => [
                'id' => 18,
                'lft' => 13,
                'rgt' => 14,
                'depth' => 2,
                'name' => 'Категория 23',
            ],
        ]
    ],
    1 => [
        'id' => 14,
        'lft' => 16,
        'rgt' => 17,
        'depth' => 1,
        'name' => 'Категория 12',
    ],
    2 => [
        'id' => 15,
        'lft' => 18,
        'rgt' => 19,
        'depth' => 1,
        'name' => 'Категория 13',
    ],
]
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Дерево

Сообщение futbolim »

Всё, разобрался, спасибо!
Иногда не так важны ответы, как ощущение того, что можно где-то их получить ; )
Ответить