我有一个存储为id,lat,lng和name的数据库中的位置列表。在我的前端表单上,我有一个接受坐标的输入,然后计算从发布的坐标到数据库的距离。一旦我得到所有这些值,我现在想要从fronend形式中选择最接近坐标的前五个位置。请查看下面的代码。我仍然无法弄清楚如何只挑选前五个。我使用键(距离)按升序对数组进行了排序。我想选择前五个距离。
public function sos(){
$this->load->model('Sos_model');
$result = $this->Sos_model->get_coord();
$addressFrom = $_GET['from'];
$hospitals = array();
foreach ($result as $row):
$addressTo = $row->lat.', '.$row->lng;
$distance = $this->Sos_model->getDistance($addressFrom, $addressTo, "K");
$hospitals[] = $distance;
endforeach;
asort($hospitals);
$arrLength = count($hospitals);
foreach($hospitals as $x => $x_value) {
echo "Key=" . $x . ", Value=" . $x_value;
echo "<br>";
}
}
产量
键= 0,值= 23.167415619785 km 键= 2,值= 23.438390589867 km 键= 1,值= 24.648813516057 km
正如您所看到的,值(距离)按升序排列,这就是我想要使用的内容
发布于 2018-08-31 12:48:52
1)您不需要使用PHP计算距离,因为这可以直接在MySQL中完成
2)你可以使用limit
你的数据库查询,你也可以依照不同的距离进行排序,再无需使用PHP的
在下面的代码中,$lat
是你的纬度,$lng
是你的经度。lat
并且lng
是表列的名称,您还应该your_table_name
用您自己的表名替换。
$sql = "SELECT *, ( 6371 * acos( cos( radians(" . $db->real_escape_string($lat) . ") ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(" . $db->real_escape_string($lng) . ") ) + sin( radians(" . $db->real_escape_string($lat) . ") ) * sin( radians( lat ) ) ) ) AS distance FROM your_table_name ORDER BY distance ASC limit 5";
这将获得5个最近的条目,按距离(升序)排序。
https://stackoverflow.com/questions/-100002526
复制相似问题