Sortowanie tablic z uwzględnieniem specyficznych potrzeb aplikacji – sortowanie geograficzne
Sortowanie tablic z uwzględnieniem specyficznych potrzeb aplikacji – sortowanie geograficzne
Założenie: Posortujemy listę miast według odległości od punktu odniesienia, wykorzystując wzór Haversine’a do obliczenia odległości.
Krok po kroku:
- Przygotowanie danych: Zdefiniujmy tablicę z danymi miast (nazwa, szerokość geograficzna, długość geograficzna) oraz współrzędne punktu odniesienia.
- Funkcja obliczająca odległość za pomocą wzoru Haversine’a: Stwórzmy funkcję, która obliczy odległość między dwoma punktami na kuli ziemskiej.
- Sortowanie tablicy: Użyjmy funkcji `usort` do posortowania tablicy `$cities` według odległości od punktu odniesienia.
- Wyświetlenie wyników: Wyświetlmy posortowaną tablicę.
$cities = [
['name' => 'Warszawa', 'lat' => 52.2297, 'lng' => 21.0122],
['name' => 'Kraków', 'lat' => 50.0647, 'lng' => 19.9450],
['name' => 'Gdańsk', 'lat' => 54.3520, 'lng' => 18.6466],
['name' => 'Wrocław', 'lat' => 51.1079, 'lng' => 17.0385]
];
$referencePoint = ['lat' => 51.5074, 'lng' => 0.1278]; // Przykładowy punkt w Londynie
function haversineDistance($lat1, $lon1, $lat2, $lon2) {
$R = 6371; // Promień Ziemi w kilometrach
$lat1 = deg2rad($lat1);
$lon1 = deg2rad($lon1);
$lat2 = deg2rad($lat2);
$lon2 = deg2rad($lon2);
$dlat = $lat2 - $lat1;
$dlon = $lon2 - $lon1;
$a = sin($dlat / 2) * sin($dlat / 2) + cos($lat1) * cos($lat2) * sin($dlon / 2) * sin($dlon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$distance = $R * $c;
return $distance;
}
usort($cities, function ($a, $b) use ($referencePoint) {
$distanceA = haversineDistance($a['lat'], $a['lng'], $referencePoint['lat'], $referencePoint['lng']);
$distanceB = haversineDistance($b['lat'], $b['lng'], $referencePoint['lat'], $referencePoint['lng']);
return $distanceA - $distanceB; // Sortowanie rosnąco
});
foreach ($cities as $city) {
$distance = haversineDistance($city['lat'], $city['lng'], $referencePoint['lat'], $referencePoint['lng']);
echo $city['name'] . ' - Odległość: ' . round($distance, 2) . ' km' . "
";
}
Ten przykład pokazuje, jak sortować tablice w PHP w oparciu o bardziej złożone kryteria niż proste porównanie wartości. Zachęcamy do eksperymentowania z różnymi funkcjami sortowania i kryteriami, aby lepiej zrozumieć możliwości PHP.