@ant123455432143

Как плоский массив превратить в дерево?

Есть массив:

$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
    )
);

Объясните, как можно решить эту задачу?
  • Вопрос задан
  • 173 просмотра
Решения вопроса 1
E1ON
@E1ON
Programming, Gamedev, VR
function buildTree($flatArray) {
    $tree = [];
    $stack = [];

    foreach ($flatArray as $item) {
        $node = $item;
        $node['CHILD'] = [];

        while (!empty($stack) && end($stack)['DEPTH_LEVEL'] >= $item['DEPTH_LEVEL']) {
            array_pop($stack);
        }

        if (empty($stack)) {
            $tree[] = $node;
        } else {
            end($stack)['CHILD'][] = $node;
        }

        $stack[] = &$node;
    }

    return $tree;
}

$sourceArray = [];  // ваш исходный массив

$resultArray = buildTree($sourceArray);

print_r($resultArray);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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