【问题标题】:Sorting foreach results对 foreach 结果进行排序
【发布时间】:2020-01-27 06:17:10
【问题描述】:

我有一个 foreach 循环,我想按距离对结果进行排序。

foreach ($this->items as $i => $item) {

            $latitudeFrom = 123;
            $longitudeFrom = 123;

            $theta = $longitudeFrom - $this->item->longitude;
            $dist = sin(deg2rad($latitudeFrom)) * sin(deg2rad($this->item->latitude)) +  cos(deg2rad($latitudeFrom)) * cos(deg2rad($this->item->latitude)) * cos(deg2rad($theta));
            $dist = acos($dist);
            $dist = rad2deg($dist);
            $miles = $dist * 60 * 1.1515;
            $distance = $miles * 1.609344;
}

echo $distance;

我想按$distance 对其进行排序。如何做到这一点?

【问题讨论】:

  • 我认为您可以将循环体中的所有内容都放在对 php.net/manual/en/function.usort.php 的回调中,您的浮点数需要转换为 int 表示形式,但这不应该很难。
  • @AlexBarker 我无法从那里得到它。一旦我回显 $distance 我希望它被排序。
  • 你想要什么,按 $distance 排序的数组,还是只是最远/最短的 $distance?您的示例当前将距离描述为浮点数。我想我要问的是你想要的“结果”是什么。
  • @AlexBarker 是的,我想要一个按 $distance 从最近到最远排序的数组

标签: php arrays loops sorting


【解决方案1】:
$latitudeFrom = 123;
$longitudeFrom = 123;

usort($this->items, function ($item1, $item2) use ($latitudeFrom, $longitudeFrom) {
    $distance1 = acos(rad2deg(sin(deg2rad($latitudeFrom)) * sin(deg2rad($item1->latitude)) +  cos(deg2rad($latitudeFrom)) * cos(deg2rad($item1->latitude)) * cos(deg2rad($longitudeFrom - $item1->longitude)))) * 60 * 1.1515 * 1.609344;

    $distance2 = acos(rad2deg(sin(deg2rad($latitudeFrom)) * sin(deg2rad($item2->latitude)) +  cos(deg2rad($latitudeFrom)) * cos(deg2rad($item2->latitude)) * cos(deg2rad($longitudeFrom - $item2->longitude)))) * 60 * 1.1515 * 1.609344;

    $result = 0;
    if ($distance1 < $distance2) {
        $result = -1;
    } else if ($distance1 > $distance2) {
        $result = 1;
    }

    return $result;
});

$this-&gt;items 现在已排序。要颠倒顺序,只需切换&lt;&gt;

【讨论】:

  • 这里为什么不用宇宙飞船算子?
  • 虽然他/她此时应该使用 PHP 7,但我知道最好不要假设。对于那些,return $distance1 &lt;=&gt; $distance2; 应该可以工作。
  • 没有其他版本可用。您不能假设有人可能仍在使用 PHP 4,除非问题另有说明,否则请始终按照最新版本编写代码。
  • REHL 仍然支持 PHP
  • 官方支持 PHP 7.1。如果你作为回答者从不升级,那你给别人举什么例子?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2019-11-08
  • 2014-01-08
相关资源
最近更新 更多