Могу ли я получить свою переменную из цикла foreach? и отправьте его с ответом вместе с данными всех пользователей

#php #distance

#php #расстояние

Вопрос:

  1. Возможно ли, что я получаю как данные пользователя, так и расстояние вместе с данными пользователей
  2. Мне нужны все данные пользователей, которые я получаю в переменной $data вместе с $distance
  3. обе переменные должны быть в ответе.
      public function getProfessionalByCityLatLon(Request $request)
         {
          $data = DB::table('profiles')
           ->leftJoin('cities','profiles.city','=','cities.id')
           ->leftJoin('users', 'profiles.user_id', '=', 'users.id')
           ->where('cities.name', '=', $request->select_city)                        
           ->get();
    
             foreach($data as $data1){
                 $longitude1 = 23.6676092; // i will get it later from $request 
                 $latitude1 = 86.0490814; // Same with this also
                 $longitude2 = $data1->longitude;
                 $latitude2 = $data1->latitude;
    
                 $unit = 'kilometers';
                 $theta = $longitude1 - $longitude2; 
                 $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2)))   (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
                 $distance = acos($distance); 
                 $distance = rad2deg($distance); 
                 $distance = $distance * 60 * 1.1515; 
                 switch($unit) { 
                     case 'miles': 
                     break; 
                     case 'kilometers' : 
                     $distance = $distance * 1.609344;
                     $distance = $distance * 1000;  
    
                 } 
                 $profDistance = (round($distance, 2));
    
             }
             $response = [
                 'success' => true,
                 'distance' => $profDistance,
                 'user' => $data,
                 'message' => 'City retrieved successfully.',
             ];
    
             Log::info($response);
             return response()->json($response, 200);
         }
     

Комментарии:

1. Для меня это не имеет особого смысла. Что должно быть $profDistance , когда в БД больше одной записи?

2. $profDistance — это вычисленное расстояние. Мы получаем две переменные (координаты из запроса) и две из базы данных. и после вычисления расстояния между ними я хочу, чтобы результат был в одном ответе вместе с остальной информацией пользователя.

3. Значит, в БД есть только одна запись, которая соответствует? Тогда вам вообще не нужен foreach цикл. Прав ли я, предполагая, что это Laravel / Eloquent? Просто используйте first() вместо get() запроса. Вы получите обратно одну запись, которую затем сможете использовать для заполнения остальных данных.

4. Спасибо @BenHillier, я нашел решение, на самом деле, сначала я хотел получить все записи из БД, где название города и категория соответствуют параметрам, затем я хочу рассчитать расстояние для каждой записи, поступающей из БД.

Ответ №1:

Я нашел решение, на самом деле, сначала я хотел получить все записи из БД, где название города и категория соответствуют параметрам, затем я хочу рассчитать расстояние для каждой записи, поступающей из БД.

 public function getProfessionalByCity($id, $currentLat, $currentLon)
    {
        Log::info('ye city select karne k baad on load calling ');
        // Log::info($id);
        $cityname = ucfirst($id);
            $newUser = DB::table('profiles')
                        ->leftJoin('cities','profiles.city','=','cities.id')
                        ->leftJoin('users', 'profiles.user_id', '=', 'users.id')
                        ->where('cities.name', '=', $cityname)
                        ->get();
            // Log::info($newUser);
            $longitude1 = $currentLat;
            $latitude1 = $currentLon;
            foreach($newUser as $user)
            {
                $professionalAvatar = $user->avatar;
                $profileId = $user->id;
                $ProfessionalAvailable = $user->availability;
                $ProfessionalName = $user->full_name;
                $professionalProfession = $user->profession;
                $latitude2 =  $user->latitude;
                $longitude2 = $user->longitude;
                $unit = 'kilometers';
                $theta = $longitude1 - $longitude2; 
                $distance = (sin(deg2rad($latitude1)) * sin(deg2rad($latitude2)))   (cos(deg2rad($latitude1)) * cos(deg2rad($latitude2)) * cos(deg2rad($theta))); 
                $distance = acos($distance); 
                $distance = rad2deg($distance); 
                $distance = $distance * 60 * 1.1515; 
                switch($unit) { 
                    case 'miles': 
                    break; 
                    case 'kilometers' : 
                    $distance = $distance * 1.609344; 
                    // $distance = $distance * 1000;
                }
                $profId[] = $profileId ;
                $calculatedDistance[] = (round($distance, 2));
                $professName[] = $ProfessionalName;
                $profession[] = $professionalProfession;
                $availablity[] = $ProfessionalAvailable;
                $avatar[] = $professionalAvatar;
                // Log::info($calculatedDistance."ye h distance");
                // return (round($distance,2)); 
                
            }
            for($count = 0; $count < count($calculatedDistance); $count  )
                {
                   $data = array(
                    'Distance' => $calculatedDistance[$count],
                    'ProfessionalName' => $professName[$count],
                    'Profession' => $profession[$count],
                    'ID' => $profId[$count],
                    'Availablity' => $availablity[$count], 
                    'Avatar' => $avatar[$count],
                    
                   );
                   $calDistance[] =$data;
                } 
            $response = [
                'success' => true,
                'data' => $calDistance,
                'message' => 'City retrieved successfully.',
            ];
        // Log::info($response);
        return response()->json($response, 200);
    }