sort()
PHP-Arrays sortieren mit sort(), asort(), ksort() und weiteren Funktionen – praxisnah erklärt mit Beispielen.
Einführung
Das Sortieren gehört zu den häufigsten Operationen mit Arrays: eine Preisliste ordnen, Namen alphabetisch sortieren, Punktestände ranken. PHP liefert eine ganze Familie von Sortierfunktionen mit, und welche man wählt, hängt von zwei Fragen ab – nach Wert oder nach Schlüssel sortieren? und sollen die ursprünglichen Schlüssel erhalten bleiben?
Dieses Kapitel erklärt sort() und verwandte Funktionen, zeigt die jeweilige Ausgabe und hilft dabei, beim ersten Versuch die richtige Funktion zu wählen.
PHP-Array-Sortierung verstehen
PHPs Array-Sortierfunktionen verändern das Array direkt (per Referenz) und geben bei Erfolg true zurück, bei Fehlschlag false – sie geben kein neues sortiertes Array zurück. Daher schreibt man immer sort($arr);, niemals $arr = sort($arr);.
Die Funktionen folgen einem vorhersehbaren Benennungsmuster:
| Funktion | Sortiert nach | Schlüssel-Wert-Zuordnung erhalten? | Reihenfolge |
|---|---|---|---|
sort() | Wert | Nein (Indizierung ab 0,1,2…) | aufsteigend |
rsort() | Wert | Nein | absteigend |
asort() | Wert | Ja | aufsteigend |
arsort() | Wert | Ja | absteigend |
ksort() | Schlüssel | Ja | aufsteigend |
krsort() | Schlüssel | Ja | absteigend |
usort() | benutzerdefiniert (Wert) | Nein | benutzerdefiniert |
uasort() | benutzerdefiniert (Wert) | Ja | benutzerdefiniert |
uksort() | benutzerdefiniert (Schlüssel) | Ja | benutzerdefiniert |
Das Muster lässt sich leicht lesen, sobald man es kennt: Ein führendes a bedeutet „Schlüssel-Assoziationen erhalten", ein k bedeutet „nach Keyschlüssel sortieren", ein r bedeutet „Rückwärts (absteigend)" und ein u bedeutet „Benutzerdefinierter Vergleich".
sort()
Die Funktion sort() sortiert ein Array nach Wert in aufsteigender Reihenfolge. Sie ist die richtige Wahl für einfache indizierte (listenähnliche) Arrays, bei denen die ursprünglichen Schlüssel keine Rolle spielen – und genau das ist der Haken: sort() verwirft die vorhandenen Schlüssel und indiziert ab 0 neu. Auf einem assoziativen Array, das man erhalten möchte, sollte man es niemals verwenden.
$numbers = [3, 1, 2];
sort($numbers);
print_r($numbers);Ausgabe:
Array
(
[0] => 1
[1] => 2
[2] => 3
)Die Funktion funktioniert auch mit Strings und vergleicht diese alphabetisch:
$fruits = ["banana", "apple", "cherry"];
sort($fruits);
print_r($fruits);
// Array ( [0] => apple [1] => banana [2] => cherry )Die Vergleichsregel lässt sich mit dem optionalen zweiten Argument flags überschreiben – zum Beispiel SORT_NUMERIC, SORT_STRING oder SORT_NATURAL (das "img10" nach "img2" einordnet, wie es ein Mensch erwarten würde).
asort()
Die Funktion asort() sortiert nach Wert in aufsteigender Reihenfolge, bewahrt jedoch die Schlüssel-Wert-Zuordnung. Sie wird verwendet, wenn die Schlüssel eine Bedeutung tragen – beispielsweise bei einer Zuordnung von Namen zu Punktzahlen.
$scores = ['Alice' => 85, 'Bob' => 92, 'Charlie' => 78];
asort($scores);
print_r($scores);Ausgabe (Zeilen werden neu geordnet, aber jeder Name behält seine Punktzahl):
Array
(
[Charlie] => 78
[Alice] => 85
[Bob] => 92
)Im Vergleich dazu würde sort($scores) Charlie/Alice/Bob durch 0/1/2 ersetzen und die Namen vollständig verlieren.
ksort()
Die Funktion ksort() sortiert ein Array nach seinen Schlüsseln in aufsteigender Reihenfolge und behält dabei jeden Schlüssel mit seinem Wert. Dies ist praktisch, wenn Schlüssel IDs, Datumsangaben oder Bezeichnungen sind, die in einer bestimmten Reihenfolge sein sollen.
$data = ['c' => 3, 'a' => 1, 'b' => 2];
ksort($data);
print_r($data);Ausgabe:
Array
(
[a] => 1
[b] => 2
[c] => 3
)usort() und uasort()
Wenn die eingebauten Sortierungen nicht ausreichen – beim Sortieren von Objekten, nach einem verschachtelten Feld oder bei der Anwendung von Geschäftsregeln – übergibt man eine eigene Vergleichsfunktion. usort() sortiert ein normales Array (mit Neuindizierung der Schlüssel), während uasort() dasselbe tut, aber die Schlüssel beibehält.
Der Vergleichs-Callback erhält zwei Elemente und muss eine ganze Zahl zurückgeben: negativ, wenn das erste vor dem zweiten stehen soll, positiv, wenn danach, und null, wenn sie gleich sind. Der Raumschiff-Operator <=> liefert genau das zurück und ist daher die idiomatische Wahl.
$people = [
['name' => 'Alice', 'age' => 30],
['name' => 'Bob', 'age' => 25],
['name' => 'Carol', 'age' => 35],
];
usort($people, function ($a, $b) {
return $a['age'] <=> $b['age']; // sort by age, ascending
});
foreach ($people as $p) {
echo $p['name'] . ": " . $p['age'] . "\n";
}Ausgabe:
Bob: 25
Alice: 30
Carol: 35Für eine absteigende Sortierung tauscht man die Operanden: return $b['age'] <=> $a['age'];.
Absteigende Reihenfolge
Für einfaches Umkehren der Reihenfolge verwendet man die r-Varianten, anstatt einen benutzerdefinierten Callback zu schreiben: rsort() (nach Wert, Neuindizierung), arsort() (nach Wert, Schlüssel erhalten) und krsort() (nach Schlüssel, Schlüssel erhalten).
$numbers = [3, 1, 2];
rsort($numbers);
print_r($numbers);
// Array ( [0] => 3 [1] => 2 [2] => 1 )Wer eine „menschenfreundliche" alphanumerische Sortierung benötigt, sollte sich natsort() ansehen, das ["img12", "img2"] als img2, img12 sortiert – statt der strengen ASCII-Reihenfolge img12, img2.
Praktische Anwendungen der PHP-Array-Sortierung
Das Sortieren von Arrays in PHP hat verschiedene praktische Anwendungsfälle, darunter:
Arrays von Produktpreisen sortieren
Beim Aufbau einer E-Commerce-Website kann es notwendig sein, Produkte nach ihren Preisen zu sortieren. Mithilfe von PHPs Array-Sortierfunktionen lässt sich ein Array von Produktpreisen in aufsteigender oder absteigender Reihenfolge sortieren, damit Kunden Produkte nach Preisbereich filtern können.
Arrays von Datenbankdatensätzen sortieren
Beim Abrufen von Daten aus einer Datenbank kann es erforderlich sein, die Datensätze nach bestimmten Kriterien zu sortieren, wie Datum, Uhrzeit oder alphabetischer Reihenfolge. Mit PHPs Array-Sortierfunktionen lassen sich die Datenbankdatensätze nach dem Abrufen sortieren, was die Datenanalyse erleichtert.
Arrays von Benutzereingaben sortieren
Beim Erfassen von Daten aus Benutzereingaben kann es notwendig sein, die Daten nach bestimmten Kriterien zu sortieren, wie Alter oder Standort. Mit PHPs Array-Sortierfunktionen lassen sich die Benutzereingaben in aufsteigender oder absteigender Reihenfolge sortieren, was die Anzeige für andere Benutzer vereinfacht.
Fazit
Die Wahl der richtigen Sortierfunktion hängt von zwei Fragen ab: Wird nach Wert oder nach Schlüssel sortiert, und sollen die ursprünglichen Schlüssel erhalten bleiben? Man verwendet sort()/rsort() für einfache Listen, asort()/arsort() und ksort()/krsort(), wenn Schlüssel eine Rolle spielen, und usort()/uasort(), wenn benutzerdefinierte Regeln benötigt werden. Da alle diese Funktionen das Array direkt sortieren und einen booleschen Wert zurückgeben, muss man sie als Anweisungen aufrufen – nicht deren Ergebnis dem Array zuweisen.