Получение иерархии разделов средствами Битрикс API

Приведу небольшой примерчик как одним запросом и одним циклом получить иерархию разделов в виде:

Array
(
    [ROOT] => Array
        (
            [CHILD] => Array
                (
                    [12] => Array
                        (
                            [ID] => 12
                            [~ID] => 12
                            [NAME] => Раздел с ид 12
                            [~NAME] => Раздел с ид 12 
                            [DEPTH_LEVEL] => 1
                            [~DEPTH_LEVEL] => 1
                            [CHILD] => Array
                                (
                                    [63] => Array
                                        (
                                            [ID] => 63
                                            [~ID] => 63
                                            .............
                                            [CHILD] => Array
                                                (
                                                ........
                                                )
                                        )
                                     .......
                                    [63] => Array
                                        (
                                            [ID] => 63
                                            [~ID] => 63
                                            .............
                                        )
                                     .......
                                )
                        )
                 ..............
                )
        )
)

На мой взгляд, с такой структурой работать в большинстве случаев удобнее, чем со списком, отсортированном по LEFT_MARGIN

Итак код:

$arFilter = array(		
    'ACTIVE' => 'Y',
    'IBLOCK_ID' => $arParams['IBLOCK_ID'],
    'GLOBAL_ACTIVE'=>'Y',
);
$arSelect = array('IBLOCK_ID','ID','NAME','DEPTH_LEVEL','IBLOCK_SECTION_ID');
$arOrder = array('DEPTH_LEVEL'=>'ASC','SORT'=>'ASC');
$rsSections = CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
$sectionLinc = array();
$arResult['ROOT'] = array();
$sectionLinc[0] = &$arResult['ROOT'];
while($arSection = $rsSections->GetNext()) {
    $sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']] = $arSection;
    $sectionLinc[$arSection['ID']] = &$sectionLinc[intval($arSection['IBLOCK_SECTION_ID'])]['CHILD'][$arSection['ID']];
}
unset($sectionLinc);

Если мы получаем только активные элементы, то важно указать в фильтре ‘GLOBAL_ACTIVE’=>’Y’, иначе мы можем получить активный элемент с неактивным предком, и его некуда будет определить в иерархию.

В $arSelect нужно не забыть указать IBLOCK_SECTION_ID, иначе иерархию построить не получится

Первое поле в сортировке $arOrder должно быть ‘DEPTH_LEVEL’=>’ASC’, так как иерархия строится от предков к потомкам

Построение иерархии происходит через массив ссылок $sectionLinc

Источник: http://max22.ru/bx-solutions/section-hierarchy/