Задача 1:

Нужно передать массив из значений ID раздела (отобранных по какому-то фильтру, в данном случае по коду бренда достаются товары этого бренда и их финальная секция IBLOCK_SECTION_ID) в GetNavChain, который достает путь по дереву от корня до раздела SECTION_ID (массив всех разделов), требуется разбить массив так, чтобы разделы не повторялись и выводились в зависимости от уровня вложенности раздела.

Массив без разделения:

[2030]
[156]
[554]
[2030]
[2036]
[179]

Решение:

Крутим GetNavChain и передаем ему из массива $arIdSect значение  IBLOCK_SECTION_ID. Достаем весь массив GetNext. Проверяем и отбираем корневой раздел, смотрим на первый уровень DEPTH_LEVEL ==1. Остальные элементы так отбираем по уровням, и смотрим у кого какой родитель.

В итоге получается массив:

[SECTION]
[1]
      [2030]
[2]
      [2036]
            [156]
            [2036]
[3]
      [156]
            [554]
      [2036]
            [179]

// Вытащит всех родителей
foreach ($arIdSect as $Sect):
   $res = CIBlockSection::GetNavChain($arParams['IBLOCK_ID'], $Sect, array());
   while ($obj = $res->GetNext())
   {
      if($obj['DEPTH_LEVEL'] == 1)
         $arResult['SECTION'][$obj['DEPTH_LEVEL']][$obj['ID']] = $obj;
      else
         $arResult['SECTION'][$obj['DEPTH_LEVEL']][$obj['IBLOCK_SECTION_ID']][$obj['ID']] = $obj;
   }
endforeach;

Продолжение следует…