2017-02-12 55 views
1

我从数据库中的用户的纬度和经度阵列中的 ,我有我的纬度和经度排序数组,从数组计算

现在我想计算距离和排序从我的数据库用户与

$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 

但我不会工作。 感谢您的帮助:)

+0

'排序($ distn)',$ DSTN看起来并不像一个数组 –

+0

•萨达西文皮莱,$ distn是一个值,是使用数组中的值为数组中的每个值计算的。 array:user1 => lat => lng,user2 => lat => lang,等等...我想计算用户和我之间的距离并对它进行排序 – Sentry

回答

2

创建一个距离函数:

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"; 
} 
+0

我有两个以上的用户。我想计算每个创建的用户的距离并对它们进行排序,以便首先显示最近的用户。所以lat和lng来自我的数据库中的一个数组。我必须将函数放入第一个foreach循环吗? – Sentry

+0

有两个功能,你的意思是? – Philip

+0

我再次告诉你我的问题。在这里。谢谢你试图帮助我 – Sentry