@BBQ4YOU

Как создать дерево категорий?

Собственно вопрос весьма заезженный и многими был решен, но во многих решениях нет изящности и красоты, что можете подсказать по такой телеге.

protected $data = [
        ['id'=>0, 'title'=>'Электроника', 'parent_id' => null],
        ['id'=>1, 'title'=>'Компьютеры', 'parent_id' => 0],
        ['id'=>2, 'title'=>'ПК', 'parent_id' => 1],
        ['id'=>3, 'title'=>'Ноутбуки', 'parent_id' => 1],
        ['id'=>4, 'title'=>'Мобильные телефоны', 'parent_id' => 0],
        ['id'=>5, 'title'=>'Бытовая химия', 'parent_id' => null],
        ['id'=>6, 'title'=>'Порошок', 'parent_id' => 5],
        ['id'=>7, 'title'=>'Мыло', 'parent_id' => 5],
        ['id'=>8, 'title'=>'Трансформеры', 'parent_id' => 3],
    ];
    

    public function buidTree($data) {
        foreach ($data as &$item){
            if($item['parent_id'] !== null){
                foreach ($data as &$item_2){
                    if($item_2['id'] == $item['parent_id']) {
                        $item_2['child'][] = &$item;
                    }
                }
            }
        }
        return $data;
    }


Все ок, но как красиво избавиться от ссылок главных ветках?
Можно создать отдельный объект для:

['id'=>1, 'title'=>'Компьютеры', 'parent_id' => 0],
['id'=>4, 'title'=>'Мобильные телефоны', 'parent_id' => 0],

чтобы остальные элементы не мешались при обработке. Или же пройтись по этим элементам и заменить их ссылки на реальные объекты.
  • Вопрос задан
  • 321 просмотр
Решения вопроса 1
udjin123
@udjin123
PHP, Golang, React
Вот работаю с интернет магазином там около 2500 категорий. Получается 2500*2500, дальше я думаю все сами поймете. Вот так лучше навскидку... От null избавляемся, зачем он нужен вообще?

public function buildTree($data) {

    $childs = array();

    foreach($data as &$item) {
         $childs[$item['parent_id']][] = &$item;
         unset($item);
    }

    foreach($data as &$item) {
        if (isset($childs[$item['id']])) {
            $item['childs'] = $childs[$item['id']];
        }
    }
    return $childs[0];
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@justabit
Встречный вопрос. Тебе на сколько уровней в "глубину" надо? Есть решение на бесконечный траверс. Может быть не самое красивое решение, но работает быстро и получает полную структуру.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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