Таким образом, в переменной $map_sec хранится дерево разделов. В отличие от гениально простого алгоритма, предложенного Юлией по ссылке в начале статьи - данный алгоритм также учитывает и те разделы, который не имеют подразделов, а являются листьями на первом же уровне вложенности.
Ну и напоследок, алгоритм вывода дерева, начиная с конкретного узла, или всего дерева целиком:
function ShowElementsTree($category_arr,$parent_id){
if(intval($parent_id)>0){
if (isset($category_arr[$parent_id])) {
foreach ($category_arr[$parent_id]['CHILDS'] as $value) { // Обходим
echo "<div st yle=\"margin-left:" . ($value['DEPTH_LEVEL'] * 25) . "px;\">" . $value['ID'].'. '.$value['NAME'].' ('.$value['ELEMENT_CNT'].')' . "</div>";
echo "<div st yle=\"margin-left:" . ($value['DEPTH_LEVEL'] * 35) . "px;\">";
// тут выводим какие-то дополнительные данные о разделе
echo "</div>";
if (count($category_arr[$value["ID"]]['CHILDS'])>0){
//Рекурсивно вызываем эту же функцию, но с новым $parent_id
ShowElementsTree($category_arr,$value["ID"]);
} else {
//Выводим листик
}
}
}
} else {
foreach($category_arr as $parent_id=>$arItems){
if (isset($category_arr[$parent_id])) {
$value = $category_arr[$parent_id];
echo "<div>" . $value['ID'].'. '.$value['NAME'].' ('.$value['ELEMENT_CNT'].')' . "</div>";
foreach ($category_arr[$parent_id]['CHILDS'] as $value) { //Обходим
echo "<div st yle=\"margin-left:" . ($value['DEPTH_LEVEL'] * 25) . "px;\">" . $value['ID'].'. '.$value['NAME'].' ('.$value['ELEMENT_CNT'].')' . "</div>";
echo "<div st yle=\"margin-left:" . ($value['DEPTH_LEVEL'] * 35) . "px;\">";
// тут выводим какие-то дополнительные данные о разделе
echo "</div>";
if (count($category_arr[$value["ID"]]['CHILDS'])>0){
// Рекурсивно вызываем эту же функцию, но с новым $parent_id
ShowElementsTree($category_arr,$value["ID"]);
}
else{
//Выводим листик
}
}
}
}
}
}
Таким образом, если нужно вывести все дерево, вызываем функцию:
ShowElementsTree($map_sec,'');
а для того, чтобы вывести ветку только для одного раздела, вторым параметром передаем этот раздел.
Надеюсь, кому-то кроме меня этот алгоритм будет полезен ...
Мне потом, кстати, доброжелатели написали, что его не правильно называть "естественным", а нужно называть его "общим". Не знаю теперь, на сколько верен тот или иной термин, вообще я изначально опиралась на англоязычные источники, где оно называлось general tree.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».