Задача - вывести определенные разделы и расположенные в них элементы используя ORM Bitrix в следующей виде:
Название раздела 1
- Документ 1
- Документ 2
Название раздела N
- Документ N
- Документ N
Условия - Один элемент может находится в разных разделах. Уровень вложенности разделов может быть разный. Выполнить выборку из БД желательно за один запрос.
Реализация
Используем ORM Bitrix
use \Bitrix\Main\Loader;
Loader::includeModule('iblock');
$iblockId = 7; // ID Инфоблока
$sections = array(298, 4); // ID необходимых разделов
$elementId = 29; // ID элемента - для проверки в каких разделах состоит элемент
// API инфоблока - Docs
// Попробуем реализовать через getList
$elements = \Bitrix\Iblock\Elements\ElementDocsTable::getList([
// Чтобы получить все разделы элемента, в select указываем SECTIONS
// Из SECTIONS выберем только ID, NAME и добавим алиасы SECTION_
'select' => ['ID', 'NAME', 'IBLOCK_ID', 'SECTION_ID'=>'SECTIONS.ID', 'SECTION_NAME'=>'SECTIONS.NAME'],
'filter' => [
'IBLOCK_ID' => $iblockId, // ID инфоблока
'SECTIONS.ID' => $sections, // ID необходимых разделов
// 'ID' => $elementId, // Для проверки в каких разделах состоит элемент
],
'limit' => '20', // Количество элементов
])->fetchAll();
В результаты получаем следующий массив
Один элемент с 'ID' => 29 состоит в двух разделах, разного уровня вложенности. Ключи в массиве 0 и 2.
Array(
[0] => Array
(
[ID] => 29
[NAME] => Федеральный закон от 25.12.2008 №273-ФЗ "О противодействии коррупции"
[IBLOCK_ID] => 7
[SECTION_ID] => 4
[SECTION_NAME] => Противодействие коррупции
)
[1] => Array
(
[ID] => 36
[NAME] => Положение о комиссии по урегулированию споров и предотвращению конфликта интересов
[IBLOCK_ID] => 7
[SECTION_ID] => 4
[SECTION_NAME] => Противодействие коррупции
)
[2] => Array
(
[ID] => 29
[NAME] => Федеральный закон от 25.12.2008 №273-ФЗ "О противодействии коррупции"
[IBLOCK_ID] => 7
[SECTION_ID] => 298
[SECTION_NAME] => Архив
)
[3] => Array
(
[ID] => 29
[NAME] => Постановление правительства от 05.07.2013 №568 "О распространении ограничений"
[IBLOCK_ID] => 7
[SECTION_ID] => 298
[SECTION_NAME] => Архив
)
)
Вопрос - Как сформировать результат $elements в массив следующего вида?
Желательно в ответе написать реализацию.
Array
(
[0] => Array
(
[SECTION_ID] => 29
[SECTION_NAME] => Раздел 1
[ELEMENTS] => Array
(
[0] => Array
(
[ID] => 11
[ELEMENT_NAME] => Документ 1
)
[1] => Array
(
[ID] => 223
[ELEMENT_NAME] => Документ 2
)
)
)
[1] => Array
(
[SECTION_ID] => 30
[SECTION_NAME] => Раздел N
[ELEMENTS] => Array
(
[0] => Array
(
[ID] => 44
[ELEMENT_NAME] => Документ N
)
[1] => Array
(
[ID] => 323
[ELEMENT_NAME] => Документ N
)
)
)
)