uasort()
uasort() sortiert ein assoziatives Array nach Werten mit einer benutzerdefinierten Vergleichsfunktion und erhält dabei die Schlüssel.
Arrays in PHP mit uasort() sortieren
Die PHP-Funktion uasort() sortiert ein assoziatives Array nach seinen Werten mithilfe einer selbst geschriebenen Vergleichsfunktion und behält dabei die Zuordnung jedes Werts zu seinem ursprünglichen Schlüssel bei. Das „u" steht für user-defined (benutzerdefiniert – Sie liefern die Vergleichslogik), das „a" steht für associative (assoziativ – Schlüssel/Wert-Paare bleiben erhalten).
Diese Seite erklärt, was uasort() tut, seine Syntax, wie man eine korrekte Vergleichsfunktion schreibt, und zeigt Arbeitsbeispiele für einfache, assoziative und mehrdimensionale Arrays – jedes Ergebnis ist die echte Ausgabe des ausgeführten Codes.
Was uasort() tut und wann man es verwendet
Die meisten PHP-Sortierfunktionen ignorieren entweder die Schlüssel oder erlauben nur die Sortierung nach eingebauten Vergleichsregeln. uasort() bietet beides auf einmal:
- Sie steuern die Reihenfolge. Sie übergeben einen Callback, der entscheidet, welcher von zwei Werten zuerst kommt – so können Sie nach Länge, nach einem verschachtelten Feld, in umgekehrter Reihenfolge, nach einer benutzerdefinierten Prioritätsliste sortieren – alles, was sich in Code ausdrücken lässt.
- Schlüssel bleiben bei ihren Werten. Nach der Sortierung zeigt
$array["John"]weiterhin auf Johns Wert; nur die Reihenfolge, in der die Paare durchlaufen werden, ändert sich.
Greifen Sie auf uasort() zurück, wenn beide dieser Bedingungen zutreffen: Sie brauchen eine benutzerdefinierte Regel und die Schlüssel sind bedeutsam (ein Name, eine ID, ein Slug). Wenn die Schlüssel nur austauschbare 0, 1, 2…-Positionen sind, ist usort() einfacher, da es die Schlüssel neu nummeriert. Wenn Sie nach den Schlüsseln statt nach den Werten sortieren möchten, verwenden Sie uksort(). Wenn Sie nur eine einfache auf- oder absteigende Wertsortierung ohne benutzerdefinierte Regel benötigen, erledigen asort() und arsort() das ohne Callback.
Syntax
uasort(array &$array, callable $callback): boolarray &$array— das zu sortierende Array. Das&bedeutet, es wird per Referenz übergeben:uasort()sortiert das Array direkt und gibttrue/falsezurück – es gibt kein neues sortiertes Array zurück.callable $callback— Ihre Vergleichsfunktion. Sie erhält zwei Werte,$aund$b, und muss eine ganze Zahl zurückgeben, die PHP deren relative Reihenfolge mitteilt.- Rückgabewert —
bool, immertrue(es gibt einen Wert zurück, damit es in Ausdrücken verwendet werden kann, aber normalerweise ruft man es wegen seines Nebeneffekts auf$arrayauf).
Da das Array direkt verändert wird, schreiben Sie
uasort($array, ...);in einer eigenen Zeile – schreiben Sie nicht$array = uasort($array, ...), da das Ihre Daten mittrueüberschreiben würde.
Die Vergleichsfunktion schreiben
Der Callback vergleicht zwei Werte und gibt eine ganze Zahl zurück:
- eine negative Zahl, wenn
$avor$bkommen soll, 0, wenn deren Reihenfolge keine Rolle spielt (sie gelten als gleich),- eine positive Zahl, wenn
$anach$bkommen soll.
Die sauberste Methode dafür ist der Spaceship-Operator <=>, der genau -1, 0 oder 1 zurückgibt:
// ascending
fn($a, $b) => $a <=> $b;
// descending — just flip the operands
fn($a, $b) => $b <=> $a;Der ältere Stil ($a < $b) ? -1 : 1 funktioniert ebenfalls, gibt aber nie 0 zurück, sodass gleiche Elemente eine willkürliche Reihenfolge erhalten. Bevorzugen Sie <=>; es ist kürzer, korrekt für den Gleichheitsfall und funktioniert für Zahlen, Strings und Arrays.
Beispiel 1: Werte eines indizierten Arrays sortieren (Schlüssel bleiben erhalten)
Hier sortiert uasort() die Zahlen aufsteigend, aber beachten Sie: Die ursprünglichen Schlüssel bleiben bei den Werten – das ist der Unterschied zu sort(), das sie von 0…9 neu nummerieren würde.
Ausgabe:
Array
(
[1] => 1
[3] => 1
[6] => 2
[0] => 3
[9] => 3
[2] => 4
[4] => 5
[8] => 5
[7] => 6
[5] => 9
)Beispiel 2: Assoziatives Array nach Wert sortieren
Das ist der häufigste Anwendungsfall: Personen nach Alter sortieren, während ihre Namen als Schlüssel erhalten bleiben.
Ausgabe:
Array
(
[Mary] => 28
[Jane] => 28
[John] => 32
[David] => 37
[Bob] => 45
)Um vom Ältesten zum Jüngsten zu sortieren, tauschen Sie die Operanden: fn($a, $b) => $b <=> $a.
Beispiel 3: Mehrdimensionales Array nach einem verschachtelten Feld sortieren
Wenn jedes Element selbst ein Array ist, erhält der Callback das gesamte Unter-Array, sodass Sie in es hineinindizieren, um das Sortierfeld auszuwählen. Hier sortieren wir nach dem Alter ([1]).
Ausgabe:
Array
(
[1] => Array
(
[0] => Mary
[1] => 28
)
[3] => Array
(
[0] => Jane
[1] => 28
)
[0] => Array
(
[0] => John
[1] => 32
)
[4] => Array
(
[0] => David
[1] => 37
)
[2] => Array
(
[0] => Bob
[1] => 45
)
)Für Zeilen, die durch ein assoziatives Feld verschlüsselt sind, ersetzen Sie $a[1] durch etwas wie $a['age'].
uasort() vs usort()
Die Funktionen sind bis auf die Schlüssel identisch. Führen Sie dieselben Daten durch beide:
<?php
$ages = ["John" => 32, "Mary" => 28, "Bob" => 45];
$copy = $ages;
usort($copy, fn($a, $b) => $a <=> $b);
echo "usort (keys lost):\n";
print_r($copy);
uasort($ages, fn($a, $b) => $a <=> $b);
echo "uasort (keys kept):\n";
print_r($ages);Ausgabe:
usort (keys lost):
Array
(
[0] => 28
[1] => 32
[2] => 45
)
uasort (keys kept):
Array
(
[Mary] => 28
[John] => 32
[Bob] => 45
)Häufige Fallstricke
- Es gibt
truezurück, nicht das Array. Lesen Sie das sortierte Ergebnis aus der Variable, die Sie übergeben haben, nicht aus dem Rückgabewert. - Die Sortierung ist vor PHP 8.0 nicht stabil. Wenn zwei Werte gleich sind, war ihre relative Reihenfolge in älteren Versionen implementierungsdefiniert. Seit PHP 8.0 sind alle Sortierfunktionen (einschließlich
uasort()) stabil, sodass gleiche Elemente ihre ursprüngliche Reihenfolge behalten. - Behandeln Sie den Gleichheitsfall immer.
1für „nicht kleiner als" zurückzugeben (anstatt0) kann gleiche Elemente in altem PHP durcheinanderbringen und ist schlicht falsch;<=>löst das automatisch.
Verwandte Funktionen
usort()— gleiche benutzerdefinierte Sortierung, nummeriert aber Schlüssel neu.uksort()— nach Schlüsseln mit einem benutzerdefinierten Callback sortieren.asort()/arsort()— Wertsortierung, auf- und absteigend, kein Callback nötig.ksort()— nach Schlüsseln sortieren ohne Callback.- Arrays in PHP sortieren — Überblick über jede Sortierfunktion und wann man welche einsetzt.
Fazit
uasort() ist das Werkzeug zum Sortieren eines assoziativen Arrays nach Werten mit einer eigenen Vergleichsregel, während die Schlüssel erhalten bleiben. Kombinieren Sie es mit dem Spaceship-Operator für saubere, korrekte Callbacks, denken Sie daran, dass es in-place sortiert, und wählen Sie es gegenüber usort(), wenn die Schlüssel eine Bedeutung tragen.