usort()
Erfahren Sie, wie PHP's usort() ein Array mit einer benutzerdefinierten Vergleichsfunktion sortiert – mit Beispielen für Strings, Zahlen und Objekte.
PHPs usort()-Funktion sortiert ein Array mit einer Vergleichsfunktion, die Sie selbst schreiben. Während eingebaute Funktionen wie sort() Werte nur auf eine Art ordnen können (aufsteigend, nach Wert), erlaubt usort() jede beliebige Regel – Objekte nach einer Eigenschaft sortieren, Zahlen in einer benutzerdefinierten Reihenfolge oder Strings nach einer Tiebreak-Regel. Diese Seite erklärt, wie der Vergleichs-Callback funktioniert, zeigt Beispiele für Strings, Zahlen und Objekte und behandelt typische Fallstricke.
Was ist die usort()-Funktion?
Die usort()-Funktion ist eine eingebaute PHP-Funktion, die ein Array nach einer eigenen Vergleichsregel sortiert. Im Gegensatz zu Standard-Sortierfunktionen, die nach Wert oder Schlüssel in auf- oder absteigender Reihenfolge sortieren, erfordert usort() einen Callback, der die Vergleichslogik definiert. Sie verändert das ursprüngliche Array an Ort und Stelle und gibt bei Erfolg true oder bei Misserfolg false zurück (das heißt, Sie sortieren das Array, aber der Rückgabewert enthält nicht das sortierte Ergebnis).
Wie der Vergleichs-Callback funktioniert
Der Callback erhält zwei Elemente, $a und $b, und muss eine ganze Zahl zurückgeben, die usort() deren relative Reihenfolge mitteilt:
- eine negative Zahl, wenn
$avor$bkommen soll, - eine positive Zahl, wenn
$anach$bkommen soll, 0, wenn sie als gleich betrachtet werden.
Seit PHP 7 erledigt der Spaceship-Operator <=> genau das in einem Schritt: $a <=> $b gibt -1, 0 oder 1 zurück. Die meisten Vergleichs-Callbacks lassen sich so auf ein einziges return reduzieren.
Hinweis: usort() ist keine stabile Sortierung. Wenn zwei Elemente als gleich verglichen werden, ist die ursprüngliche relative Reihenfolge nicht garantiert. Ab PHP 8.0 ist die Sortierung stabil, frühere Versionen sind es jedoch nicht. Außerdem indiziert usort() das Array sequenziell beginnend bei 0 neu, sodass alle ursprünglichen Schlüssel verloren gehen – verwenden Sie uasort(), wenn Sie Schlüsselzuordnungen beibehalten müssen.
Syntax
Die Syntax der usort()-Funktion lautet wie folgt:
Die Syntax der usort()-Funktion in PHP
usort($array, $callback);Hier ist $array das zu sortierende Array und $callback die Callback-Funktion, die die benutzerdefinierten Sortierregeln definiert.
Parameter und Rückgabewert
| Parameter | Typ | Beschreibung |
|---|---|---|
$array | array | Das zu sortierende Array. |
$callback | callable | Eine benutzerdefinierte Vergleichsfunktion. |
Rückgabewert: Gibt bei Erfolg true oder bei Misserfolg false zurück.
Verwendungsbeispiel
Sehen wir uns ein Beispiel an, um zu verstehen, wie die usort()-Funktion funktioniert. Angenommen, wir haben ein Array von Namen, das wir alphabetisch sortieren möchten, aber mit einer benutzerdefinierten Regel, dass alle Namen, die mit "J" beginnen, zuerst kommen sollen.
Wie verwendet man die usort()-Funktion in PHP?
In diesem Beispiel definieren wir eine Callback-Funktion, die zwei Namen vergleicht und basierend auf den benutzerdefinierten Sortierregeln -1, 0 oder 1 zurückgibt. Wenn der erste Buchstabe von $a "J" ist und der erste Buchstabe von $b nicht "J" ist, kommt $a vor $b. Wenn der erste Buchstabe von $a nicht "J" ist und der erste Buchstabe von $b "J" ist, kommt $b vor $a. Wenn beide Namen mit "J" beginnen oder beide nicht mit "J" beginnen, verwenden wir den modernen PHP-Spaceship-Operator (<=>) zum alphabetischen Vergleich.
Nach Ausführung dieses Codes wird das $names-Array wie folgt sortiert:
Array
(
[0] => Jack
[1] => Jenny
[2] => John
[3] => Adam
[4] => Bob
)Objekte oder Arrays nach einem Feld sortieren
Der häufigste reale Anwendungsfall von usort() ist das Ordnen einer Liste von Datensätzen (assoziative Arrays oder Objekte) nach einem ihrer Felder – etwas, das sort() nicht leisten kann. Hier sortieren wir eine Liste von Produkten nach dem Preis, aufsteigend:
<?php
$products = [
["name" => "Book", "price" => 15],
["name" => "Pen", "price" => 2],
["name" => "Laptop", "price" => 900],
];
usort($products, fn ($a, $b) => $a["price"] <=> $b["price"]);
print_r(array_column($products, "name"));Der gesamte Vergleich ist ein einzelner Spaceship-Ausdruck. Die Ausgabe, günstigstes zuerst:
Array
(
[0] => Pen
[1] => Book
[2] => Laptop
)Um absteigend zu sortieren, tauschen Sie einfach die Operanden: $b["price"] <=> $a["price"].
Häufige Fallstricke
- Missbrauch des Rückgabewerts.
usort()gibttrue/falsezurück, nicht das sortierte Array. Das Schreiben von$sorted = usort($arr, ...)liefert Ihnentrue, nicht Ihre Daten. Das Array wird an Ort und Stelle sortiert. - Schlüssel werden zurückgesetzt. Ursprüngliche Schlüssel werden verworfen und durch
0, 1, 2, …ersetzt. Verwenden Sieuasort(), um Schlüssel zu erhalten, oderuksort(), um nach Schlüsseln zu sortieren. - Einen boolean vom Callback zurückgeben. Das Zurückgeben von
$a > $b(ein boolean) funktioniert für aufsteigende Reihenfolge zufällig, bricht aber bei absteigender Reihenfolge und gleichen Werten ab. Geben Sie immer eine ganze Zahl zurück – bevorzugen Sie<=>.
Verwandte Funktionen
sort()— Array nach Wert aufsteigend sortieren, ohne Callback.asort()— nach Wert sortieren, dabei Schlüssel beibehalten.ksort()— nach Schlüssel sortieren.uasort()— wieusort(), aber behält Schlüsselzuordnungen bei.uksort()— nach Schlüsseln mit einem benutzerdefinierten Callback sortieren.
Fazit
In diesem Artikel haben wir die usort()-Funktion in PHP besprochen und gezeigt, wie sie verwendet werden kann, um Arrays mit benutzerdefinierten Sortierregeln zu sortieren. Durch die Definition einer Callback-Funktion können Sie Arrays in beliebiger Reihenfolge sortieren, basierend auf Ihren eigenen Regeln. Diese Funktion ist besonders nützlich in Situationen, in denen die eingebauten Sortierfunktionen in PHP für Ihre Anforderungen nicht ausreichen. Mit der usort()-Funktion haben Sie die vollständige Kontrolle darüber, wie Ihre Arrays sortiert werden.