PHP 距离我最近排序+二维数组按指定列排序
思路:
1、获取我的位置,即:我的经纬度
2、各站点须有位置 即:排序对象有位置经纬度
3、查询要排序的站点列表
4、循环遍历计算 与我的距离
5、二维数组按 指定列(距离)排序
具体如下:
1、是小程序中的功能,因而小程序接口获取我的经纬度
wx.getLocation({ type: 'wgs84', success(res) {
let latitude = res.latitude;//纬度
let longitude = res.longitude;//经度
//排序请求时 携带以上参数
}
})
2、项目中新增站点的时候须有位置地图功能,保存每条站点数据包含该站点的 经纬度数据
3、查询站点列表 略 假设查询站点数据如下:
$list = [ ['id'=>1,'name'=>'站点1','latitude'=>34.45678,'longitude'=>116.43055], ['id'=>2,'name'=>'站点2','latitude'=>34.35678,'longitude'=>116.43055], ['id'=>3,'name'=>'站点3','latitude'=>34.55678,'longitude'=>116.43055] ]
4、循环遍历计算距离
$latitude = $_POST['my_latitude']; //我的纬度 $latitude = $_POST['my_latitude']; //我的经度 foreach ($list as $k=>$v){ $list[$k]['distance'] = get_distance($my_latitude,$my_longitude,$v['latitude'],$v['longitude']); } //经纬度 两点间的距离 function get_distance($lat1, $lon1, $lat2, $lon2) { $R = 6371393; //地球平均半径,单位米 $dlat = deg2rad($lat2-$lat1);//角度转化为弧度 $dlon = deg2rad($lon2-$lon1); $a = pow(sin($dlat/2), 2) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * pow(sin($dlon/2), 2); $c = 2 * atan2(sqrt($a), sqrt(1-$a)); $d = $R * $c; return round($d); }
5、按距离排序
$list = arr_sort($list,'distance'); //二维数组 按二维指定列排序 //$arr 要排序的二维数组 //$key 排序依据的列 //$order 升序|降序 默认升序 function arr_sort($arr,$key,$order=SORT_ASC){ $key_arr = array_column($arr,$key); if(empty($key_arr)){ return false; } array_multisort($key_arr,$order,$arr); return $arr; }