MWCodebymw.de ↗
PHP

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';   // -1

Und 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

#PHP#usort#Sortieren#Arrays#Spaceship

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 →