Сама идея построения дерева очень проста: необходимо всем элементам найти их предков, а после этого всем предкам добавить их потомков. Реализация ниже:
class someClass{
var $arSections; // как-то его заполняем массив
function Get1CTreeSections()
{
$sections = [];
foreach ($this->arSections as $arSection)
{
$sections[$arSection['GUID']] = $arSection; // преобразовываем массив,
//чтобы ключами были обязательно прописаны уникальные идентификаторы
}
if(empty($sections)){
return false;
}
$this->arSections = $sections;
unset($sections);
$arTree = self::MakeTreeFromArray($this->arSections,false,'GUID','SGUID');
return $arTree;
}
function MakeTreeFromArray($array,$key=false,$keyField='GUID',$parentKeyField='SGUID'){
$branch = [];
foreach ($array as &$element){
if($element[$parentKeyField] !== null && $array[$element[$parentKeyField]]==null){
unset($element[$parentKeyField]);
}
if($element[$parentKeyField]==$key){
$children = self::MakeTreeFromArray(
$array,
$element[$keyField],
$keyField,
$parentKeyField);
if($children){
$element['children'] = $children;
}
$branch[$element[$keyField]] = $element;
unset($element);
}
}
return $branch;
}
}