Бортовой журнал Ктулху

Построение многоуровневого меню неограниченной вложенности из массива, PHP, BITRIX

Давно ничего не писал, вот появилась причина.

Потратил сегодня кучу времени, но нашел в интернете два разных решения, которые использовал для построения меню в Битриксе. Данная реализация подойдет для любого движка или скрипта. На входе массив, на выходе - готовое меню.

 

Только для Битрикса, получаем массив:

$arFilter = Array('IBLOCK_ID'=>2, 'ACTIVE'=>'Y');
$db_list = CIBlockSection::GetList(Array(), $arFilter, true, array(), false);
while($ar_result = $db_list->GetNext()) {
$arr[] = Array("ID"=>$ar_result[ID], "NAME"=>$ar_result[NAME], "LEVEL"=>$ar_result[DEPTH_LEVEL], "SECTION_PAGE_URL"=>$ar_result [SECTION_PAGE_URL], "SECTION_PAGE_URL"=>$ar_result [SECTION_PAGE_URL], "PARENT"=>$ar_result[IBLOCK_SECTION_ID] );
}

 

Получаем такой массив:

[50] => Array ( [ID] => 39 [NAME] => Джинсы [LEVEL] => 3 [SECTION_PAGE_URL] => /catalog/dzhinsy/ [PARENT] => 21 )
[51] => Array ( [ID] => 40 [NAME] => Прочее [LEVEL] => 3 [SECTION_PAGE_URL] => /catalog/prochee/ [PARENT] => 21 )
[52] => Array ( [ID] => 41 [NAME] => Аксессуар 1 [LEVEL] => 3 [SECTION_PAGE_URL] => /catalog/aksessuar_1/ [PARENT] => 29 )

В нем есть элемент [PARENT] с ID родительского элемента, который будет использован для построения дерева.

Функция создает многомерный массив с древовидной структурой.

$new = array();
foreach ($arr as $a){
 $new[$a['PARENT']][] = $a;
}

$tree1 = createTree1($new1, array($arr[0]));

function createTree1(&$list, $parent){
 $tree = array();
 foreach ($parent as $k=>$l){
 if(isset($list[$l['ID']])){
 $l['children'] = createTree($list, $list[$l['ID']]);
 }
 $tree[] = $l;
 } 
 return $tree;
}

А эта функция выводит готовое меню.

function view_cat1 ($dataset) {
foreach ($dataset as $menu) {
echo '<li><a href="'.$menu["SECTION_PAGE_URL"].'">'.$menu["NAME"].'</a>';
if($menu['children']) {
echo '<ul>';
view_cat($menu['children']);
echo '</ul>';
}
echo '</li>';
}
}
view_cat1 ($tree1);

Прикрепляю рабочий файлик для битрикса. Вписать только ID инфоблока каталога.

Вложения:
ФайлОписаниеРазмер файла:
Скачать этот файл (test.zip)test.zip 0.8 Кб