sort($array) sortiert ein Array aufsteigend, direkt im Array. Es ändert die übergebene Variable und liefert true, also rufst du es in einer eigenen Zeile auf und verwendest danach das Array. rsort() sortiert absteigend.
PHP hat eine Sortierfunktion für jede Kombination aus „nach Wert oder nach Schlüssel“, „aufsteigend oder absteigend“ und „Schlüssel behalten oder nicht“:
| Funktion | Sortiert nach | Reihenfolge | Schlüssel |
|---|---|---|---|
sort | Wert | aufsteigend | neu nummeriert 0, 1, 2 |
rsort | Wert | absteigend | neu nummeriert |
asort | Wert | aufsteigend | behalten |
arsort | Wert | absteigend | behalten |
ksort | Schlüssel | aufsteigend | behalten |
krsort | Schlüssel | absteigend | behalten |
usort | deiner Funktion | nach Wahl | neu nummeriert |
uasort | deiner Funktion | nach Wahl | behalten |
uksort | deiner Funktion auf Schlüsseln | nach Wahl | behalten |
Ein assoziatives Array nach Wert sortieren
sort() auf ein assoziatives Array wirft die Schlüssel weg. Verwende asort(), um nach Wert zu sortieren und jeden Schlüssel bei seinem Wert zu lassen, oder arsort() für den höchsten Wert zuerst.
Ein Array mit ksort nach Schlüssel sortieren
ksort() ordnet nach Schlüssel, krsort() nach Schlüssel in umgekehrter Reihenfolge. Das ist praktisch, bevor du Einstellungen ausgibst oder einen Query-String in stabiler Reihenfolge baust.
Eigene Reihenfolge mit usort und dem Spaceship-Operator
Mit usort($array, $callback) bestimmst du die Reihenfolge. Der Callback bekommt zwei Elemente und liefert eine negative Zahl, wenn das erste vorne stehen soll, eine positive Zahl, wenn das zweite vorne stehen soll, und 0, wenn beide gleich sind. Der Spaceship-Operator <=> liefert genau das.
banana und cherry haben dieselbe Länge, also liefert der Callback für sie 0, und sie bleiben in der Reihenfolge, die sie schon hatten. Das Sortieren in PHP ist seit PHP 8.0 stabil: Gleiche Elemente behalten ihre vorherige Reihenfolge.
Ein mehrdimensionales Array nach einem Wert sortieren
Um eine Liste von Zeilen nach einem Feld zu sortieren, vergleichst du dieses Feld in usort. Um nach zwei Feldern zu sortieren, vergleichst du Arrays: <=> vergleicht sie Element für Element, also entscheidet das zweite Feld nur bei Gleichstand im ersten.
Der zweite Vergleich setzt $b["age"] auf die linke Seite und $a["age"] auf die rechte, was nur die Reihenfolge des Alters umkehrt. array_multisort(array_column($people, 'city'), SORT_ASC, array_column($people, 'age'), SORT_DESC, $people) liefert dieselbe Reihenfolge ohne Callback: Es sortiert nach den herausgezogenen Spalten und ordnet $people passend dazu um.
Natürliche Reihenfolge und Sortier-Flags
Standardmäßig vergleicht PHP Zahlen als Zahlen und Strings als Strings. Dateinamen mit Zahlen darin sortieren sich anders, als Menschen es erwarten: img10 kommt vor img2, und jeder großgeschriebene Name kommt vor jedem kleingeschriebenen. Die Flags ändern, wie Werte verglichen werden.
SORT_NATURAL liest Ziffernfolgen als Zahlen, SORT_FLAG_CASE ignoriert Groß- und Kleinschreibung, und SORT_STRING erzwingt einen Vergleich Zeichen für Zeichen, selbst bei numerischen Strings. natsort() und natcasesort() folgen derselben Idee, behalten aber die Schlüssel.
Typischer Fehler: das Ergebnis von sort zuweisen
Jede Sortierfunktion liefert true und ändert das übergebene Array. Wenn du den Rückgabewert zuweist, verlierst du das Array:
Wenn du eine sortierte Kopie brauchst und das Original behalten willst, kopierst du das Array zuerst in eine neue Variable und sortierst die Kopie, wie es das asort-Beispiel oben mit $copy macht.
Häufig gestellte Fragen
Warum liefert sort() true statt des sortierten Arrays?
Die Sortierfunktionen von PHP sortieren das Array direkt, über eine Referenz, und liefern true. Ruf sort($arr); in einer eigenen Zeile auf und verwende danach $arr. $arr = sort($arr); ersetzt dein Array durch true.
Wie sortiere ich ein assoziatives Array nach Wert und behalte die Schlüssel?
Verwende asort($arr) für aufsteigend oder arsort($arr) für absteigend. sort() und rsort() sortieren auch nach Wert, werfen die Schlüssel aber weg und nummerieren ab 0 neu.
Wie sortiere ich in PHP ein mehrdimensionales Array nach einem Wert?
Verwende usort mit dem Spaceship-Operator auf dem Feld: usort($rows, fn($a, $b) => $a['age'] <=> $b['age']);. Vertausche $a und $b für absteigende Reihenfolge und vergleiche Arrays wie [$a['city'], $a['age']] <=> [$b['city'], $b['age']], um nach zwei Feldern zu sortieren.
Ist das Sortieren in PHP stabil?
Ja, seit PHP 8.0 ist jede Sortierfunktion stabil: Elemente, die als gleich gelten, behalten die Reihenfolge, die sie vor dem Sortieren hatten. Deshalb funktioniert es wie erwartet, erst nach einem Feld und dann nach einem anderen zu sortieren.
Wie sortiere ich Strings mit Zahlen in natürlicher Reihenfolge?
Verwende natsort($arr) oder sort($arr, SORT_NATURAL), die img2 vor img10 setzen. Füge SORT_FLAG_CASE hinzu (SORT_NATURAL | SORT_FLAG_CASE) oder verwende natcasesort, um Groß- und Kleinschreibung zu ignorieren.