uksort()
PHP uksort() erklärt: Array nach Schlüsseln mit benutzerdefinierter Vergleichsfunktion sortieren. Syntax, Rückgabewert und Unterschiede zu ksort() und usort().
Einführung
uksort() sortiert ein Array nach seinen Schlüsseln mithilfe einer selbst geschriebenen Vergleichsfunktion. Anders als ksort(), das Schlüssel nur in natürlicher aufsteigender Reihenfolge sortiert, lässt uksort() Sie die Reihenfolge selbst bestimmen — alphabetisch, umgekehrt, nach Stringlänge, nach einer benutzerdefinierten Prioritätsliste oder nach jeder Regel, die sich in Code ausdrücken lässt. Die Zuordnung von Schlüssel zu Wert bleibt stets erhalten.
Diese Seite behandelt die Syntax und den Rückgabewert, wie der Vergleichs-Callback funktioniert, mehrere ausführbare Beispiele (einschließlich des Raumschiffoperators), häufige Fallstricke und den Unterschied zwischen uksort() und verwandten Sortierfunktionen.
Syntax
uksort(array &$array, callable $callback): true$array— das zu sortierende Array. Es wird per Referenz übergeben und direkt sortiert, sodass die ursprüngliche Variable unmittelbar geändert wird.$callback— eine Vergleichsfunktion, die zwei Schlüssel ($aund$b) erhält und eine ganze Zahl zurückgibt:- eine negative Zahl, wenn
$avor$bstehen soll, 0, wenn sie als gleich gelten,- eine positive Zahl, wenn
$anach$bstehen soll.
- eine negative Zahl, wenn
Die Funktion gibt true zurück (in PHP 8+; zuvor gab sie einen bool zurück). Da die Sortierung per Referenz erfolgt, lesen Sie das Ergebnis aus der ursprünglichen Array-Variable — nicht aus dem Rückgabewert.
Der Callback vergleicht Schlüssel, keine Werte. Das ist der einzige Unterschied zwischen
uksort()undusort()(das Werte vergleicht) sowieuasort()(das Werte vergleicht, aber die Schlüsselzuordnung beibehält).
Einfaches Beispiel: Schlüssel alphabetisch sortieren
Angenommen, wir haben ein Array von Früchten mit Namen als Schlüssel und möchten diese alphabetisch nach Schlüssel sortieren:
<?php
$fruits = [
"orange" => 3,
"apple" => 2,
"banana" => 1,
];
function cmp($a, $b)
{
return strcmp($a, $b);
}
uksort($fruits, "cmp");
print_r($fruits);strcmp() gibt bereits eine negative, null oder positive ganze Zahl zurück und lässt sich daher direkt als Callback einsetzen. Die Ausgabe ist nach Schlüssel sortiert:
Array
(
[apple] => 2
[banana] => 1
[orange] => 3
)Den Raumschiffoperator verwenden
Seit PHP 7 gibt der Raumschiffoperator <=> -1, 0 oder 1 für kleiner als, gleich oder größer als zurück — genau das Format, das uksort() erwartet. Mit einer Pfeilfunktion wird der Callback zum Einzeiler:
<?php
$data = ["delta" => 1, "alpha" => 2, "charlie" => 3, "bravo" => 4];
uksort($data, fn($a, $b) => $a <=> $b);
print_r($data);Dies sortiert die Schlüssel aufsteigend:
Array
(
[alpha] => 2
[bravo] => 4
[charlie] => 3
[delta] => 1
)Um die Reihenfolge umzukehren, tauschen Sie die Operanden: fn($a, $b) => $b <=> $a.
Eine benutzerdefinierte Sortierreihenfolge
Die eigentliche Stärke von uksort() liegt darin, nach einer Regel zu sortieren, die keine eingebaute Funktion bietet — zum Beispiel nach Schlüssellänge und bei Gleichstand alphabetisch:
<?php
$config = [
"id" => 1,
"name" => "Ann",
"is_active" => true,
"x" => 0,
];
uksort($config, function ($a, $b) {
return strlen($a) <=> strlen($b) // shortest keys first
?: strcmp($a, $b); // ties broken alphabetically
});
print_r($config);Der ?:-Kurzschluss gibt das Längenvergleichsergebnis zurück, es sei denn, es ist 0 — dann wird auf den alphabetischen Vergleich zurückgegriffen:
Array
(
[x] => 0
[id] => 1
[name] => Ann
[is_active] => 1
)Häufige Fallstricke
- Die Funktion gibt
truezurück, nicht das sortierte Array.$sorted = uksort($arr, ...)ergibttrue. Verwenden Sie danach$arr. - Das ursprüngliche Array wird verändert. Kopieren Sie es zuerst (
$copy = $arr;), wenn Sie die ursprüngliche Reihenfolge behalten möchten. - Der Callback muss konsistent sein. Zufällige Rückgabewerte (z. B.
rand(-1, 1)) führen zu undefinierten Ergebnissen. Zum Mischen verwenden Sieshuffle()für Werte oderarray_rand()für Schlüssel. - Geben Sie eine ganze Zahl zurück. Die Rückgabe eines
boolfunktioniert zwar durch Typumwandlung, ist aber fehleranfällig —falsewird zu0(gleich), daher istreturn $a < $b;ein Bug. Verwenden Sie<=>oderstrcmp().
Vergleich von uksort() mit verwandten Funktionen
| Funktion | Sortiert nach | Benutzerdefinierter Callback | Behält Schlüsselzuordnung |
|---|---|---|---|
uksort() | Schlüsseln | ja | ja |
ksort() | Schlüsseln | nein (natürliche Reihenfolge) | ja |
usort() | Werten | ja | nein (neu indiziert) |
uasort() | Werten | ja | ja |
asort() | Werten | nein | ja |
Kurz gesagt: Greifen Sie zu uksort(), wenn Sie ein assoziatives Array nach seinen Schlüsseln nach einer Regel sortieren müssen, die ksort() nicht ausdrücken kann. Weitere Informationen zum Thema finden Sie unter Sorting Arrays in PHP.
Fazit
uksort() sortiert ein assoziatives Array nach seinen Schlüsseln mithilfe eines selbst kontrollierten Vergleichs-Callbacks, ändert das Array direkt und behält die Schlüssel-Wert-Verknüpfungen bei. Mit dem Raumschiffoperator ist der Callback prägnant, und benutzerdefinierte Logik ermöglicht Sortierungen, die keine eingebaute Funktion bietet.
Diagramm
graph LR
A[Array] --> B(Function);
B --> C[Comparison result];
C --> D{Is result negative?};
D -->|Yes| E[Swap];
C -->|No| F[Do not swap];
F --> G[Next comparison];
E --> G[Next comparison];