Есть массив:
$sourceArray = array(
array('ID' => 705, 'NAME' => 'Телефоны и гаджеты', 'DEPTH_LEVEL' => 1),
array('ID' => 706, 'NAME' => 'Смартфоны', 'DEPTH_LEVEL' => 2),
array('ID' => 5586, 'NAME' => 'Аксессуары для гаджетов', 'DEPTH_LEVEL' => 2),
array('ID' => 715, 'NAME' => 'Аксессуары для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 716, 'NAME' => 'Чехлы для смартфонов', 'DEPTH_LEVEL' => 4),
array('ID' => 5536, 'NAME' => 'Чехлы для Apple', 'DEPTH_LEVEL' => 5),
array('ID' => 5539, 'NAME' => 'Чехлы для Samsung', 'DEPTH_LEVEL' => 5),
array('ID' => 3010, 'NAME' => 'Защитные стекла для телефонов', 'DEPTH_LEVEL' => 3),
array('ID' => 660, 'NAME' => 'Компьютерная техника', 'DEPTH_LEVEL' => 1)
);
Нужно получить древовидную структуру:
$array = array(
array(
'ID' => 705,
'NAME' => 'Телефоны и гаджеты',
'DEPTH_LEVEL' => 1,
'CHILD' => array(
array(
'ID' => 706,
'NAME' => 'Смартфоны',
'DEPTH_LEVEL' => 2
),
array(
'ID' => 5586,
'NAME' => 'Аксессуары для гаджетов',
'DEPTH_LEVEL' => 2,
'CHILD' => array(
array(
'ID' => 715,
'NAME' => 'Аксессуары для телефонов',
'DEPTH_LEVEL' => 3,
'CHILD' => array(
array(
'ID' => 716,
'NAME' => 'Чехлы для смартфонов',
'DEPTH_LEVEL' => 4,
'CHILD' => array(
array(
'ID' => 5536,
'NAME' => 'Чехлы для Apple',
'DEPTH_LEVEL' => 5
),
array(
'ID' => 5539,
'NAME' => 'Чехлы для Samsung',
'DEPTH_LEVEL' => 5
)
)
),
array(
'ID' => 3010,
'NAME' => 'Защитные стекла для телефонов',
'DEPTH_LEVEL' => 4,
'SECTION_PAGE_PATH_TEMPLATE' => '#SITE_DIR#/catalog/#SECTION_CODE_PATH#/'
)
)
)
)
)
)
),
array(
'ID' => 660,
'NAME' => 'Компьютерная техника',
'DEPTH_LEVEL' => 1
)
);
Вот решение, где dbAllSections содержит в себе все разделы. Оно работает, но я никак понять не могу, зачем тут делать $node = &$tree; и $node = &$node[$ancestor['INDEX']]['CHILDREN'];. Ссылки же говорят, что другая переменная будет ссылаться на то же значение, но для чего делать $node = &$tree; каждую итерацию, если они и так ссылаются на одно значение. Зачем делать $node = &$node[$ancestor['INDEX']]['CHILDREN']; тоже не понятно.
Для удобства
https://3v4l.org/RPkHb
$tree = [];
$stack = [];
while ($item = $dbAllSections->fetch()) {
$node = &$tree;
while (!empty($stack) && $stack[count($stack) - 1]['DEPTH_LEVEL'] >= $item['DEPTH_LEVEL']) {
array_pop($stack);
}
foreach ($stack as $ancestor) {
$node = &$node[$ancestor['INDEX']]['CHILDREN'];
}
$node[] = [
'ID' => $item['ID'],
'NAME' => $item['NAME']
];
$stack[] = [
'INDEX' => count($node) - 1,
'DEPTH_LEVEL' => $item['DEPTH_LEVEL'],
];
}