Arrays sortieren in PHP – usort und der Spaceship-Operator
Eine Liste nach Datum, dann nach Name, absteigend – ohne Bibliothek und ohne if-Kaskade. usort plus <=> macht daraus zwei Zeilen, die man auch in einem halben Jahr noch versteht.
Sortieren ist eine dieser Aufgaben, bei denen man mit ein bisschen Wissen sehr viel Code spart. Der Kern ist ein Operator, den PHP 7 mitgebracht hat und den ich täglich benutze: <=>, gesprochen „Spaceship".
Er vergleicht zwei Werte und liefert -1, 0 oder 1:
1 <=> 2; // -1 (links ist kleiner)
2 <=> 2; // 0 (gleich)
3 <=> 2; // 1 (links ist größer)
'apfel' <=> 'birne'; // -1Und genau diese drei Werte will usort von dir hören.
Nach einem Feld sortieren
$projekte = [
['name' => 'Website', 'faellig' => '2026-09-01'],
['name' => 'App', 'faellig' => '2026-08-14'],
['name' => 'Shop', 'faellig' => '2026-08-14'],
];
usort($projekte, fn($a, $b) => $a['faellig'] <=> $b['faellig']);Das war es. Kein if, kein return -1, kein Nachdenken über die Reihenfolge der Vergleiche.
Absteigend brauchst du keine zweite Funktion — dreh einfach die Seiten um:
usort($projekte, fn($a, $b) => $b['faellig'] <=> $a['faellig']);Nach mehreren Feldern – der eigentliche Trick
Was, wenn zwei Projekte am selben Tag fällig sind und dann der Name entscheiden soll? Dafür vergleicht man Arrays. <=> geht sie Element für Element durch und hört beim ersten Unterschied auf:
usort($projekte, fn($a, $b) =>
[$a['faellig'], $a['name']] <=> [$b['faellig'], $b['name']]
);Das ist genau das Verhalten, das man will: erst nach Datum, bei Gleichstand nach Name. Für drei oder vier Kriterien hängst du weitere Elemente an — die Zeile bleibt lesbar.
Gemischte Richtungen (Datum aufsteigend, Betrag absteigend) gehen ebenfalls, indem du bei dem einen Feld die Seiten tauschst:
usort($rechnungen, fn($a, $b) =>
[$a['datum'], $b['betrag']] <=> [$b['datum'], $a['betrag']]
);Hier steht bei betrag bewusst $b links — dieser eine Teil dreht sich damit um.
Die Falle mit Zahlen als Text
'10' <=> '9'; // -1 → "10" gilt als kleiner!Bei Strings vergleicht PHP zeichenweise. Kommen deine Werte aus einer Datenbank oder aus einem Formular, sind sie oft Text — auch wenn Zahlen darin stehen. Deshalb caste ich vor dem Vergleich:
usort($zeilen, fn($a, $b) => (int)$a['anzahl'] <=> (int)$b['anzahl']);Dasselbe gilt für Datumsangaben: '2026-09-01' lässt sich als Text sortieren, weil das Format Jahr-Monat-Tag zufällig auch alphabetisch stimmt. '01.09.2026' nicht — dort musst du erst umwandeln.
Und die Schlüssel?
usort wirft die Array-Schlüssel weg und nummeriert neu. Wenn du sie behalten willst, nimm uasort; willst du nach Schlüsseln sortieren, uksort. Die Vergleichsfunktion ist bei allen dreien dieselbe.
Du hast eine Liste im Admin oder auf einer Website, die in der falschen Reihenfolge steht? Das ist meist eine Zeile. Schreib mir, wenn du dabei Hilfe brauchst.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
Eigene Exceptions in PHP – Fehler, die man auseinanderhalten kann
catch (Exception $e) fängt alles – auch das, was du gar nicht behandeln wolltest. Mit ein paar eigenen Exception-Klassen wird aus „irgendwas ging schief" eine Fehlermeldung, mit der der Nutzer etwas anfangen kann.
Generatoren in PHP – eine 2-GB-Datei lesen, ohne den Speicher zu sprengen
file() lädt die ganze Datei in ein Array – bei großen Dateien ist danach der Speicher voll und das Skript tot. Mit yield gibst du Zeile für Zeile heraus und brauchst konstant wenig Speicher, egal wie groß die Datei ist.