Задать вопрос
@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
    )
);


Вот решение, где 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'],
            ];
        }
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Средний 10 комментариев
Пригласить эксперта
Ответы на вопрос 2
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
думаю все эксперты согласятся что правильный ответ "через ж..пу"...
Ответ написан
Комментировать
Если этот массив получен из CIBlockSection::GetList, попробуйте получить помимо DEPTH_LEVEL, еще LEFT_MARGIN и RIGHT_MARGIN. И по ветвям уже из массива можно будет построить дерево.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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