chelkaz
@chelkaz

Почему функция не возвращает?

Если в функции get_full_city я в место return вывожу print_r то все верно выводит как и задумано. Но мне нужно не вывести, в готовые массивы собрать в один и работать с ним после foreach. Но если я ставлю return, то он отдает мне null. В момент else у меня массив собран и все эти собранные готовые массивы мне нужно как то получить после foreach, но как не могу понять, return в else отдает null.
class SearchController extends Controller
{
    //
    public function input(Request $request)
    {
// В таблице все города и тут мы ищем до последнего родителя
        $city = $request->input('city'); 
        $arr = LocName::where('NAME', 'like', '%'.$city.'%')->take(10)->get(); // Выбераем все совпадения
        $full_arr = array();

        function get_full_city($one, $full_arr)
        {
            $loc_id = $one->LOCATION_ID; // Получили ИД города
            $location = DB::table('location')->where('ID', $loc_id)->first(); // Список родителя и прочего
            $name_arr = DB::table('loc_name')->where('LANGUAGE_ID', 'ru')->where('LOCATION_ID', $location->ID)->first();
            $name = $name_arr->NAME;

            $parent = $location->PARENT_ID;
            $type_id = $location->TYPE_ID;
            $type = DB::table('loc_type_name')->where('TYPE_ID', $type_id)->where('LANGUAGE_ID', 'ru')->first();
            $full_arr[] = array(
                'name' => $name,
                'type' => $type->NAME,
            );
            echo ">>>".$location->DEPTH_LEVEL.PHP_EOL;
            if($location->DEPTH_LEVEL > 1) // Если не главный родитель то продолжаем
            {
                $par_ar = DB::table('loc_name')->where('LANGUAGE_ID', 'ru')->where('LOCATION_ID', $parent)->first();
                get_full_city($par_ar, $full_arr); // Отправляем на следующий круг
            }
            else {
               // И тут если постепить print_r($full_arr) То все верно выводится по списку, то-есть когда достигаем главного родителя, то выводим, но мне нужно все собрать в массив и я пробую вернуть ретурном 
                return $full_arr;
            }
        }
        foreach ($arr as $one)
        {
            $data[] = get_full_city($one, $full_arr);
        }
        И в итоге значения массива null, хотя если в функции вместо ретурна ставить вывод, то он правильно выводит.
        dd($data);

    }
}
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
chelkaz
@chelkaz Автор вопроса
Ошибка была в первом условии, так как нужно было но просто начинать функцию:
if($location->DEPTH_LEVEL > 1) // Если не главный родитель то продолжаем
            {
                $par_ar = DB::table('loc_name')->where('LANGUAGE_ID', 'ru')->where('LOCATION_ID', $parent)->first();
                get_full_city($par_ar, $full_arr); // Отправляем на следующий круг
            }

А возвращать через return!
if($location->DEPTH_LEVEL > 1) // Если не главный родитель то продолжаем
            {
                $par_ar = DB::table('loc_name')->where('LANGUAGE_ID', 'ru')->where('LOCATION_ID', $parent)->first();
                return get_full_city($par_ar, $full_arr); // Отправляем на следующий круг
            }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Quieteroks
php программист
Никогда не думали, что срабатывает условие true, а не false, где кстати вы не возвращаете значение из рекурсии. Поэтому при печати все четко, на втором кругу он и выводит нужные вам значения. При этом на первом кругу все печально, ибо он ушел в рекурсию и не вернул ничего.
Ответ написан
Ваш ответ на вопрос

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

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