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”:
| Funkcja | Sortuje po | Kolejność | Klucze |
|---|---|---|---|
sort | wartości | rosnąca | numerowane od nowa 0, 1, 2 |
rsort | wartości | malejąca | numerowane od nowa |
asort | wartości | rosnąca | zachowane |
arsort | wartości | malejąca | zachowane |
ksort | kluczu | rosnąca | zachowane |
krsort | kluczu | malejąca | zachowane |
usort | twojej funkcji | twój wybór | numerowane od nowa |
uasort | twojej funkcji | twój wybór | zachowane |
uksort | twojej funkcji na kluczach | twój wybór | zachowane |
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.