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
Beträge und Zahlen in PHP formatieren – number_format, sprintf und Intl
1234.5 ist keine Anzeige, sondern ein Wert. Auf der Rechnung soll 1.234,50 € stehen, in der API 1234.50 und im Dateinamen 1234-50. Drei Aufgaben, drei Werkzeuge – und ein Fehler, den fast jeder einmal macht.
Benannte Argumente in PHP 8 – Schluss mit true, false, null, true
Ein Aufruf wie erstelle($a, true, false, null, true) sagt nichts darüber, was die Wahrheitswerte bedeuten. Mit benannten Argumenten steht es im Aufruf – und optionale Parameter lassen sich überspringen.
Reguläre Ausdrücke in PHP – benannte Gruppen statt $m[3]
Ein Treffer-Array aus Zahlen liest sich nach zwei Wochen wie eine Geheimschrift. Benannte Gruppen geben jedem Teil einen Namen – und preg_replace_callback ersetzt damit Dinge, die kein einfacher Ersetzungsstring kann.