Menu

PHP Array sortieren: sort(), usort(), asort() und ksort()

sort($array) sortiert eine Liste direkt, asort und ksort sortieren ein assoziatives Array nach Wert oder nach Schlüssel, und usort sortiert mit deinem eigenen Vergleich. Hier: alle davon, ein mehrdimensionales Array nach einer Spalte sortieren und den klassischen Fehler $sorted = sort($arr) vermeiden.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

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“:

FunktionSortiert nachReihenfolgeSchlüssel
sortWertaufsteigendneu nummeriert 0, 1, 2
rsortWertabsteigendneu nummeriert
asortWertaufsteigendbehalten
arsortWertabsteigendbehalten
ksortSchlüsselaufsteigendbehalten
krsortSchlüsselabsteigendbehalten
usortdeiner Funktionnach Wahlneu nummeriert
uasortdeiner Funktionnach Wahlbehalten
uksortdeiner Funktion auf Schlüsselnnach Wahlbehalten

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.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S