Menu

Sortowanie tablic w PHP: sort(), usort(), asort(), ksort()

sort($array) sortuje listę w miejscu, asort i ksort sortują tablicę asocjacyjną po wartości lub po kluczu, a usort sortuje według twojego porównania. Poznaj je wszystkie, posortuj tablicę wielowymiarową po kolumnie i uniknij klasycznego błędu $sorted = sort($arr).

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

sort($array) sortuje tablicę rosnąco, w miejscu. Zmienia przekazaną zmienną i zwraca true, więc wywołujesz ją w osobnej linii, a potem używasz tablicy. rsort() sortuje malejąco.

PHP ma funkcję sortującą dla każdej kombinacji „po wartości lub po kluczu”, „rosnąco lub malejąco” i „z zachowaniem kluczy lub bez”:

FunkcjaSortuje poKolejnośćKlucze
sortwartościrosnącanumerowane od nowa 0, 1, 2
rsortwartościmalejącanumerowane od nowa
asortwartościrosnącazachowane
arsortwartościmalejącazachowane
ksortkluczurosnącazachowane
krsortkluczumalejącazachowane
usorttwojej funkcjitwój wybórnumerowane od nowa
uasorttwojej funkcjitwój wybórzachowane
uksorttwojej funkcji na kluczachtwój wybórzachowane

Sortowanie tablicy asocjacyjnej po wartości

sort() na tablicy asocjacyjnej wyrzuca klucze. Użyj asort(), aby sortować po wartości i zachować każdy klucz przy jego wartości, albo arsort(), aby największe były pierwsze.

Sortowanie tablicy po kluczu przez ksort

ksort() porządkuje po kluczu, krsort() po kluczu odwrotnie. Przydaje się przed wypisaniem ustawień albo zbudowaniem query stringa w stałej kolejności.

Własna kolejność przez usort i operator statku kosmicznego

usort($array, $callback) pozwala ci decydować o kolejności. Callback dostaje dwa elementy i zwraca liczbę ujemną, jeśli pierwszy ma być pierwszy, dodatnią, jeśli drugi, i 0, jeśli są równe. Operator statku kosmicznego <=> zwraca dokładnie to.

banana i cherry mają tę samą długość, więc callback zwraca dla nich 0 i zostają w kolejności, którą już miały. Sortowanie w PHP jest stabilne od PHP 8.0: równe elementy zachowują wcześniejszą kolejność.

Sortowanie tablicy wielowymiarowej po wartości

Aby posortować listę wierszy po jednym polu, porównuj to pole w usort. Aby sortować po dwóch polach, porównuj tablice: <=> porównuje je element po elemencie, więc drugie pole rozstrzyga tylko remisy w pierwszym.

Drugie porównanie stawia $b["age"] po lewej stronie, a $a["age"] po prawej, co odwraca tylko kolejność wieku. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) daje tę samą kolejność bez callbacku: sortuje po wyciągniętych kolumnach i układa $people odpowiednio.

Kolejność naturalna i flagi sortowania

Domyślnie PHP porównuje liczby jak liczby, a stringi jak stringi. Nazwy plików z liczbami sortują się wtedy w nieoczekiwany sposób: img10 wypada przed img2, a każda nazwa wielkimi literami przed każdą małymi. Flagi zmieniają sposób porównywania wartości.

SORT_NATURAL czyta ciągi cyfr jako liczby, SORT_FLAG_CASE ignoruje wielkość liter, a SORT_STRING wymusza porównanie znak po znaku nawet dla stringów liczbowych. natsort() i natcasesort() działają na tej samej zasadzie, ale zachowują klucze.

Częsty błąd: przypisanie wyniku sort

Każda funkcja sortująca zwraca true i zmienia przekazaną tablicę. Przypisanie wartości zwracanej gubi tablicę:

Jeśli potrzebujesz posortowanej kopii i chcesz zachować oryginał, najpierw skopiuj tablicę do nowej zmiennej i sortuj kopię, tak jak przykład z asort powyżej robi z $copy.

Najczęściej zadawane pytania

Dlaczego sort() zwraca true zamiast posortowanej tablicy?

Funkcje sortujące w PHP sortują tablicę w miejscu, przez referencję, i zwracają true. Wywołaj sort($arr); w osobnej linii, a potem używaj $arr. Zapis $arr = sort($arr); zastępuje tablicę wartością true.

Jak posortować tablicę asocjacyjną po wartości i zachować klucze?

Użyj asort($arr) dla kolejności rosnącej albo arsort($arr) dla malejącej. sort() i rsort() też sortują po wartości, ale wyrzucają klucze i numerują od nowa od 0.

Jak posortować tablicę wielowymiarową po wartości w PHP?

Użyj usort z operatorem statku kosmicznego na polu: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Zamień $a i $b dla kolejności malejącej, a aby sortować po dwóch polach, porównuj tablice, na przykład [$a['city'], $a['age']] <=> [$b['city'], $b['age']].

Czy sortowanie w PHP jest stabilne?

Tak, od PHP 8.0 każda funkcja sortująca jest stabilna: elementy uznane za równe zachowują kolejność sprzed sortowania. Dzięki temu sortowanie po jednym polu, a potem po innym działa zgodnie z oczekiwaniami.

Jak posortować stringi z liczbami w kolejności naturalnej?

Użyj natsort($arr) albo sort($arr, SORT_NATURAL), które stawiają img2 przed img10. Dodaj SORT_FLAG_CASE (SORT_NATURAL | SORT_FLAG_CASE) albo użyj natcasesort, aby ignorować wielkość liter.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ