chazovs
@chazovs
Корпорация Центр

Почему return обрывает рекурсию и как этого избежать?

У меня есть рекурсия, которая строит дерево типа 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,
        ]);
    }

Результат: в дампе три элемента yXTMuZg.jpg

Если убрать return $dataChild; из функции recursiveDotAdd, то рекурсия достает все 5 элементов
M8yqRza.jpg
  • Вопрос задан
  • 137 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы