У меня есть рекурсия, которая строит дерево типа orgchart.
Так как первый ряд элементов выстраивается по иной логике, чем остальные, то у меня есть два цикла foreach: первый выстраивает первый ряд элементов, второй заключен в рекурсивной функции и выстраивает все остальные ряды. Но возникает проблема. Функция добавляет значения к первому циклу через return. И это ломает рекурсию: выстраивается только одна ветка для каждого элемента первого цикла.
Чем можно заменить return, чтобы рекурсия не прерывалась?
Вот код
//показывает дерево точек компании
public function tree($id)
{
$companyModel=Company::find($id);
$allDots=$companyModel->dots;
$dotId=0;
$allData=null;
//вызывает рекурсию, создающую дерево точек
function recursiveDotAdd($child, $allDots, $id, $companyModel){
foreach ($allDots->where('parent_id', $child->id) as $child)
{
$blockId=$child->id+$companyModel->id;
dump($child->name);
$dataChild= "children: [{ head: '".$child->name."', id: '".$blockId."', contents: 'загадка',".recursiveDotAdd($child, $allDots, $id, $companyModel)." }]";
return $dataChild;
}
}
foreach ($allDots->where('parent_id', $dotId) as $dot){
$blockId=$dot->id+$companyModel->id;
if ($allData==null) {
$allData="{
head:'".$dot->name."',
id: '".$blockId."',
contents: 'не знаю что', ".recursiveDotAdd($dot, $allDots, $id, $companyModel)."
}";
} else {
$allData=$allData.", {
head:'".$dot->name."',
id: '".$blockId."',
contents: 'не знаю что', ".recursiveDotAdd($dot, $allDots, $id, $companyModel)."
}";
}
}
/* dump($allDots);*/
return view('dottree')->with([
'companyModel'=> $companyModel,
'allData'=>$allData,
]);
}
Результат: в дампе три элемента
Если убрать return $dataChild; из функции recursiveDotAdd, то рекурсия достает все 5 элементов