Sortowanie tablic jest jednym z podstawowych zadań programistycznych, które często pojawiają się podczas pracy z PHP. Chociaż samo sortowanie może wydawać się prostą operacją, PHP oferuje wiele funkcji i technik, które mogą znacznie ułatwić, a czasami nawet skomplikować, to zadanie. PHP ma kilka predefiniowanych i użytecznych funkcji, które służą do sortowania tablic (array). Za bardzo niczym to nie wyróżnia języka PHP od innych języków programowania, bo praktycznie każdy daje jakieś mechanizmy pozwalające sortować swoje tablice i listy.
Podchodząc do typu array w PHP, trzeba pamiętać, że tablice PHP mają dużą wszechstronność i są dwa rodzaje wbudowanych tablic:
- zwykłe tablice jednowymiarowe, indeksowane kolejno klasycznie liczbami całkowitymi od zera,
- tablice asocjacyjne, które mają swoje klucze, co czyni z nich praktycznie mapami (nazewnictwo takie będzie łatwiej przyswajalne dla osób mających styczność z innymi językami programowania).
Podział na dwa rodzaje tablic, ma swoje odwzorowanie w funkcjach sortujących, jedne są odpowiednie dla tablic zwykłych, drugie posortują nam poprawnie tablice asocjacyjne.
Tablicę można oczywiście posortować rosnąco lub malejąco, PHP dodatkowo radzi sobie z sortowaniem alfabetycznym i numerycznym. Mamy też możliwość przekazania swojej funkcji porównującą elementy tablicy. Dzięki funkcji porównującej elementy tablicy z łatwością posortujemy w PHP tablice wielowymiarowe, według wybranego klucza.
Warto również wspomnieć na początku, że funkcje sortujące przyjmują tablice poprzez referencje, czyli działają na oryginalnych danych. Tablica podana jako zmienna do funkcji już staje się posortowana, nie przekazujemy jej przez wartość zwracaną z funkcji. Jeżeli popełnimy taki błąd, to zmienna otrzyma wartość true, jako wynik powiedzenia się sortowania tablicy (rzadziej false, gdyby sortowanie się nie powiodło), a nie całą tablicę z danymi.
Funkcje sortujące tablice w PHP
sort() – dzięki tej funkcji posortujesz zwykłe tablice (nie asocjacyjne, czyli bez klucza) w kolejności alfabetycznej od najniższej wartości do najwyższej wartości. Funkcja sort() przyjmuje jeden parametr, czyli tablicę (array), i trzeba pamiętać, że wymaga, aby przekazywany parametr był typu array, w przeciwnym przypadku zgłosi błąd „PHP Warning: sort() expects parameter 1 to be array, string given in…” Pamiętaj również, żeby nie sortować tablicy asocjacyjnej funkcją array, bo sort() nie zgłosi błędu, ale pozbędzie się Twoich kluczy, sortując tablicę, ale wartości przypisując co kluczy liczbowych zaczynających się od zera. Rzadko, ale czasami taka konwersja może przydać się w Twoich aplikacjach.
Przykładowy kod sortowania za pomocą funkcji sort() znajdziesz poniżej
<?php
$dogBreeds = array("bocker", "afador", "akbash", "mastador");
sort($dogBreeds );
foreach ($dogBreeds as $item) {
echo $item ."\n";
}
?>
rsort() - sortuje zwykłe tablice (nie asocjacyjne) w odwróconej kolejnośc
asort() - jeżeli chcesz posortować tablice asocjacyjne, zachowując przy tym przypisanie wartości do kluczy, to funkcja ta jest zdecydowanie dla Ciebie. asort() posortuję tablicę po wartościach od najmniejszej do największej, zachowując przy tym przypisanie do pierwotnych kluczy.
<?php
$dogBreeds = array(
"mom dog" => "bocker",
"dad dog" => "afador",
"my dog" => "akbash",
"sister dog" => "mastador" );
sort($dogBreeds );
foreach ($dogBreeds as $key => $value) {
echo $key . ‘ ’ . $value."\n";
}
?>
arsort() – to funkcja działająca jak asort() , tylko sortuje tablicę od wartości największych do najmniejszych.
ksort() – czasami chcemy posortować naszą tablicę asocjacyjną według kluczy i ksort() sprawdzi się tutaj doskonale.
uasort() – funkcja ta przyjmuje jako drugi parametr nazwę naszej funkcji sortującej (polecamy używanie tutaj funkcji anonimowej). Dzięki temu rozwiązaniu możemy sortować tablice wielowymiarowe, sortować tablicę po jednym z kluczy, czy nawet sortować tablice po wartościach obiektów trzymanych w zmiennych tablicy. W logice funkcji sortujących znakomicie odnajduje się, wprowadzony w PHP 7, operator Spaceship. Callback, czyli funkcja sortująca wymaga zwracania trzech wyników, 0, kiedy dwie porównywane wartości są równe ($a==$b), -1 kiedy $a jest mniejsze niż $b oraz jeden, kiedy $b jest mniejsze niż $a. Operator spaceship skraca cały zapis.
<?php
$members = [
["first_name" => "Tom", "last_name" => "Land"],
["first_name" => "Daniel", "last_name" => "Nowak"],
["first_name" => "Jakub", "last_name" => "Kowalski"],
];
usort($members, function($a, $b) {
return $a["last_name"] <=> $b["last_name"];
});
Różnorodność funkcji sortujących
Tych funkcji sortujących jest jeszcze więcej, odsyłam oczywiście do dokumentacji PHP.
- PHP oferuje wiele funkcji do sortowania, takich jak
sort()
,asort()
,ksort()
,usort()
,uksort()
,uasort()
,natsort()
,natcasesort()
,array_multisort()
. - Każda funkcja ma swoje specyficzne zastosowanie, np. sortowanie według wartości, kluczy, z zachowaniem asocjacji klucz-wartość lub sortowanie naturalne.
Algorytmy sortowania w PHP
- Od wersji PHP 5.3.0 wewnętrzne funkcje sortujące wykorzystują hybrydowy algorytm Timsort, który jest zoptymalizowany dla danych częściowo posortowanych.
- Jest to wydajna kombinacja sortowania przez scalanie (merge sort) i sortowania przez wstawianie (insertion sort).
Zachowanie kluczy podczas sortowania
- Funkcje takie jak
sort()
irsort()
reindeksują klucze, co oznacza, że asocjacje klucz-wartość zostaną utracone. - Aby zachować klucze, należy użyć funkcji takich jak
asort()
iarsort()
, które sortują według wartości, ale utrzymują oryginalne klucze.
Sortowanie wielowymiarowych tablic
- Sortowanie wielowymiarowych tablic w PHP może być skomplikowane, ale z pomocą przychodzi funkcja
array_multisort()
. - Pozwala ona na sortowanie wielu tablic jednocześnie lub na sortowanie tablicy wielowymiarowej według wartości przypisanych do określonego klucza.
Własne funkcje porównujące
- Funkcje takie jak
usort()
,uasort()
iuksort()
pozwalają na definiowanie własnych funkcji porównujących. - Użycie tych funkcji daje programiście pełną kontrolę nad kryteriami sortowania, co jest szczególnie przydatne przy sortowaniu złożonych struktur danych.
Sortowanie naturalne
- PHP oferuje funkcję
natsort()
, która implementuje tzw. "sortowanie naturalne". - Sortowanie naturalne porządkuje ciągi znaków w sposób bardziej intuicyjny dla człowieka, np. "str2" zostanie umieszczony przed "str10".
Kwestie wydajności
- Wydajność sortowania w PHP może się różnić w zależności od używanej funkcji i rozmiaru danych.
- Dla dużych zbiorów danych warto rozważyć wybór odpowiedniej funkcji sortującej oraz testowanie wydajności na swoich przykładach.
Sortowanie z wykorzystaniem metody Schwartziana
- Technika Schwartziana, popularna w Perlu, polega na minimalizacji liczby wywołań funkcji porównującej poprzez transformację danych przed sortowaniem.
- W PHP można ją zaimplementować ręcznie, co może zwiększyć wydajność sortowania bardziej złożonych struktur danych.
Stabilność sortowania
- Większość funkcji sortujących w PHP nie gwarantuje stabilności sortowania, co oznacza, że oryginalna kolejność równych elementów może zostać zmieniona.
- Jeśli stabilność sortowania jest istotna, należy to uwzględnić, np. przez modyfikację algorytmu porównującego.
Sortowanie obiektów
- PHP pozwala na sortowanie tablic zawierających obiekty za pomocą własnych funkcji porównujących.
- Funkcja porównująca może odwoływać się do właściwości obiektów, co daje możliwość sortowania według wybranych kryteriów, np. wartości konkretnej właściwości obiektu.
Prowadziłem i rozwijałem działy SEO w bardzo dużych wydawnictwach (Agora, gazeta.pl). Specjalizuję się w tworzeniu kompleksowych rozwiązań zasięgowych oraz programowaniu. @wlazlak
Zobacz moje wszystkie artykułyWspółpracuj z nami!
Naszą mocą jest technologia i doświadczony zespółPrzez lata zdobywaliśmy doświadczenie u największych wydawców w Polsce, a teraz zadbamy o rozwój Twojej firmy od strategii wzrostu po wdrożenia na stronach dzięki naszemu własnemu software house'owi. Zaufaj nam, aby osiągać dobre wyniki.