У меня есть lat и lng от пользователя из базы данных в массиве, и у меня есть lat и lng
Теперь я хочу рассчитать расстояние и отсортировать пользователей из моей базы данных с этим
$mylat = $_SESSION['lat']; $mylng = $_SESSION['lng']; $statement = $pdo->prepare("SELECT * FROM users"); $statement->execute(); $users = $statement->fetchAll(); foreach($users as $row){ $dist = 0.0; $x1 = $mylng; $x2 = $row['lng']; $y1 = $mylat; $y2 = $row['lat']; $dist = acos(sin($x1=deg2rad($x1))*sin($x2=deg2rad($x2))+cos($x1)*cos($x2)*cos(deg2rad($y2) - deg2rad($y1)))*(6378.137); $distn = FLOOR ( ROUND($dist,1) * 2 ) / 2 ; } sort($distn); foreach ($users as $row) { $dist = 0.0; $x1 = $mylng; $x2 = $row['lng']; $y1 = $mylat; $y2 = $row['lat']; $dist = acos(sin($x1=deg2rad($x1))*sin($x2=deg2rad($x2))+cos($x1)*cos($x2)*cos(deg2rad($y2) - deg2rad($y1)))*(6378.137); $distn = FLOOR ( ROUND($dist,1) * 2 ) / 2 ; echo $row['username']; echo $distn; }
Поэтому в первом foreach я вычисляю расстояние для каждого пользователя для меня. Чем я хочу сортировать пользователей после расстояния до меня и отображать их там, где есть имя, и там расстояние до меня.
user1 0.5km distance user2 1km distance
Но я не буду работать. Спасибо за вашу помощь 🙂
Создать функцию расстояния:
function getDistance ($lat, $lon) { global $mylng, $mylat; $x1 = deg2rad($mylng); $x2 = deg2rad($lon); $y1 = deg2rad($mylat); $y2 = deg2rad($lat); $dist = acos(sin($x1)*sin($x2)+cos($x1)*cos($x2)*cos($y2 - $y1))*(6378.137); return $dist; }
Создать функцию сравнения:
function compareDistance ($user1, $user2) { return getDistance ($user1['lat'], $user1['lng']) - getDistance ($user2['lat'], $user2['lng']); }
Затем вы можете передать свой массив через uasort
:
uasort ($users, 'compareDistance');
См. http://php.net/manual/en/function.uasort.php для получения дополнительной информации.
РЕДАКТИРОВАТЬ:
Ваша программа может быть переписана:
function getDistance ($lat, $lon) { global $mylng, $mylat; $x1 = deg2rad($mylng); $x2 = deg2rad($lon); $y1 = deg2rad($mylat); $y2 = deg2rad($lat); $dist = acos(sin($x1)*sin($x2)+cos($x1)*cos($x2)*cos($y2 - $y1))*(6378.137); return $dist; } function compareDistance ($user1, $user2) { return getDistance ($user1['lat'], $user1['lng']) - getDistance ($user2['lat'], $user2['lng']); } $mylat = $_SESSION['lat']; $mylng = $_SESSION['lng']; $statement = $pdo->prepare("SELECT * FROM users"); $statement->execute(); $users = $statement->fetchAll(); uasort ($users, 'compareDistance'); foreach ($users as $row) { $dist = getDistance ($row['lat'], $row['lng']); $distn = floor(round($dist,1) * 2) / 2 ; echo $row['username']. ": " . $distn . "km distance"; }