【问题标题】:sort array by value that is calculated from the array按从数组计算的值对数组进行排序
【发布时间】:2017-02-12 13:48:02
【问题描述】:

我有一个数组中来自数据库的用户的 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

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

【问题讨论】:

  • sort($distn) , $dstn 看起来不像一个数组
  • Sadasivan Pillai ,$distn 是一个值,它是为数组中的每个值计算的值,其中包含数组中的值。 array: user1 =>lat=>lng, user2=>lat=>lang, etc... 我想计算一个用户和我之间的距离并像这样排序

标签: php arrays sorting floating-point


【解决方案1】:

创建距离函数:

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

【讨论】:

  • 我有两个以上的用户。我想计算每个创建的用户的距离并对它们进行排序,以便首先显示最近的用户。所以 lat 和 lng 来自我数据库中的一个数组。我必须将函数放在第一个 foreach 循环中吗?
  • 有两个函数,你是什么意思?
  • 我再次告诉你我的问题。下面这里。谢谢你试图帮助我