英文:
Sorting PHP array by closest location
问题
我有一个包含Paysera包裹机的数组:
Array
(
[0] => Array
(
[id] => PMFOzGmlcQ-9GmEt5vj9JTGals_1nI87Lm
[shipment_gateway_code] => lp
[code] => 0199
[address] => Array
(
[country] => LT
[city] => Vilnius
[street] => Žirmūnų g. 48A
[postal_code] => 09226
)
[coordinates] => Array
(
[latitude] => 54.70274
[longitude] => 25.30368
)
[location_name] => Express Market
[enabled] => 1
)
[1] => Array
(
[id] => PMBBGl0TsF1vuv8YqeLsn4gyWwGB9-vd98
[shipment_gateway_code] => lp
[code] => 0198
[address] => Array
(
[country] => LT
[city] => Vilnius
[street] => Lazdynėlių g. 23
[postal_code] => 04126
)
[coordinates] => Array
(
[latitude] => 54.66283
[longitude] => 25.19253
)
[location_name] => Maxima
[enabled] => 1
)
)
我也有用户坐标的数组:
Array
(
[latitude] => 54.70274
[longitude] => 25.30368
)
我需要根据距离用户最近的位置对第一个数组进行排序,但我不太理解如何做到这一点。
我尝试了以下解决方案,但似乎没有任何效果:
$cities = <your array>;
$point = array(
'latitude' => 50.6000,
'longitude' => -74.15000
);
function distance($a, $b) {
return sqrt(
pow($a['latitude'] - $b['latitude'], 2)
+ pow($a['longitude'] - $b['longitude'], 2));
}
usort($cities, function($p, $q) {
global $point;
return distance($p, $point) - distance($q, $point);
});
请帮助我实现我的目标。谢谢!
英文:
I have an array with parcel machines from Paysera:
Array
(
[0] => Array
(
[id] => PMFOzGmlcQ-9GmEt5vj9JTGals_1nI87Lm
[shipment_gateway_code] => lp
[code] => 0199
[address] => Array
(
[country] => LT
[city] => Vilnius
[street] => Žirmūnų g. 48A
[postal_code] => 09226
)
[coordinates] => Array
(
[latitude] => 54.70274
[longitude] => 25.30368
)
[location_name] => Express Market
[enabled] => 1
)
[1] => Array
(
[id] => PMBBGl0TsF1vuv8YqeLsn4gyWwGB9-vd98
[shipment_gateway_code] => lp
[code] => 0198
[address] => Array
(
[country] => LT
[city] => Vilnius
[street] => Lazdynėlių g. 23
[postal_code] => 04126
)
[coordinates] => Array
(
[latitude] => 54.66283
[longitude] => 25.19253
)
[location_name] => Maxima
[enabled] => 1
)
)
Also I have user's coordinates in array:
Array
(
[latitude] => 54.70274
[longitude] => 25.30368
)
I have to sort my first array by the nearest location to my user but I don't really understand how to do it.
I tried the following solution but it seems like it does nothing at all:
$cities = <your array>;
$point = array(
'latitude' => 50.6000,
'longitude' => -74.15000
);
function distance($a, $b) {
return sqrt(
pow($a['latitude'] - $b['latitude'], 2)
+ pow($a['longitude'] - $b['longitude'], 2));
}
usort($cities, function($p, $q) {
global $point;
return distance($p, $point) - distance($q, $point);
});
Please help me to achieve my goal. Thanks!
答案1
得分: 1
根据我从上面的评论和维基百科了解,Vincenty's formula 是计算距离的最准确的公式。
所以我编写了以下代码:
$arParcelMachines = Array(); // $arParcelMachines 是来自 Paysera 的包裹机器数组
if ($latitude && $longitude) { // $latitude 和 $longitude 是用户的坐标
foreach ($arParcelMachines as &$arParcelMachine) {
$arParcelMachine["distance"] = getDistance($latitude, $longitude, $arParcelMachine["coordinates"]["latitude"], $arParcelMachine["coordinates"]["longitude"]);
}
usort($arParcelMachines, function($a, $b) {
return $a["distance"] - $b["distance"];
});
}
function getDistance($fromLatitude, $fromLongitude, $toLatitude, $toLongitude, $radius = 6371000) { // Vincenty's formula
$fromLatitude = deg2rad($fromLatitude);
$fromLongitude = deg2rad($fromLongitude);
$toLatitude = deg2rad($toLatitude);
$toLongitude = deg2rad($toLongitude);
$deltaLongitude = abs($fromLongitude - $toLongitude);
$centralAngle = atan2(sqrt(pow(cos($toLatitude) * sin($deltaLongitude), 2) + pow(cos($fromLatitude) * sin($toLatitude) - sin($fromLatitude) * cos($toLatitude) * cos($deltaLongitude), 2)), sin($fromLatitude) * sin($toLatitude) + cos($fromLatitude) * cos($toLatitude) * cos($deltaLongitude));
return $radius * $centralAngle;
}
希望这对你有帮助。
英文:
As far as I understood from the comments above and from the Wikipedia the Vincenty's formula is the most accurate formula for calculating a distance.
So I came up with the following code:
$arParcelMachines = Array(); // $arParcelMachines is an array of parcell machines from Paysera
if ($latitude && $longitude) { // $latitude && $longitude are user's coordinates
foreach ($arParcelMachines as &$arParcelMachine) {
$arParcelMachine["distance"] = getDistance($latitude, $longitude, $arParcelMachine["coordinates"]["latitude"], $arParcelMachine["coordinates"]["longitude"]);
}
usort($arParcelMachines, function($a, $b) {
return $a["distance"] - $b["distance"];
});
}
function getDistance($fromLatitude, $fromLongitude, $toLatitude, $toLongitude, $radius = 6371000) { // Vincenty's formula
$fromLatitude = deg2rad($fromLatitude);
$fromLongitude = deg2rad($fromLongitude);
$toLatitude = deg2rad($toLatitude);
$toLongitude = deg2rad($toLongitude);
$deltaLongitude = abs($fromLongitude - $toLongitude);
$centralAngle = atan2(sqrt(pow(cos($toLatitude) * sin($deltaLongitude), 2) + pow(cos($fromLatitude) * sin($toLatitude) - sin($fromLatitude) * cos($toLatitude) * cos($deltaLongitude), 2)), sin($fromLatitude) * sin($toLatitude) + cos($fromLatitude) * cos($toLatitude) * cos($deltaLongitude));
return $radius * $centralAngle;
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论