Я хочу найти два самых дальних объекта (друг от друга) в моем массиве $ user_devices.
Каждый объект $ user_devices имеет атрибуты: id, name, imei и координаты. Ex.:
$user_devices = array(
'id' => '1',
'name' => 'First object',
'imei' => '123456789',
'coordinates' => '51.313032,11.798092'
);
То, что я пытаюсь сделать, - это пройти весь массив, преобразовать широты и долготы в x и y и, наконец, вычислить расстояние между точками.
Проблема в том, что этот алгоритм должен работать быстро, по крайней мере, с 5 000 записей (местоположений), но его интеграция в веб-сайт занимает около 20 секунд времени загрузки.
Как я могу оптимизировать этот алгоритм?
public static function get_farthest_devices($user_devices)
{
$r = 6378; // Earth radius in km
$max_distance = 0;
$count = count($user_devices);
for ($i = 0; $i < $count - 1; $i++) {
$coordinates = $user_devices[$i]->coordinates;
$coordinates_explode = explode(',', $coordinates);
$lat = $coordinates_explode[0];
$lng = $coordinates_explode[1];
$x1 = $r * cos(deg2rad($lat)) * cos(deg2rad($lng));
$y1 = $r * cos(deg2rad($lat)) * sin(deg2rad($lng));
for ($j = $i + 1; $j < $count; $j++) {
$coordinates = $user_devices[$j]->coordinates;
$coordinates_explode = explode(',', $coordinates);
$lat = $coordinates_explode[0];
$lng = $coordinates_explode[1];
$x2 = $r * cos(deg2rad($lat)) * cos(deg2rad($lng));
$y2 = $r * cos(deg2rad($lat)) * sin(deg2rad($lng));
$distance_between_points = sqrt( pow($x2-$x1, 2) + pow($y2-$y1, 2) );
if($distance_between_points > $max_distance)
{
$max_distance = $distance_between_points;
$obj_i = $user_devices[$i];
$obj_j = $user_devices[$j];
}
}
}
echo 'MAX distance is between: ' . $obj_i->name . ' (' . $obj_i->imei . ') and ' . $obj_j->name . ' (' . $obj_j->imei . ') ' . $max_distance . ' km<br/>';
}