Собственно вопрос весьма заезженный и многими был решен, но во многих решениях нет изящности и красоты, что можете подсказать по такой телеге.
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],
чтобы остальные элементы не мешались при обработке. Или же пройтись по этим элементам и заменить их ссылки на реальные объекты.