Start · Sprachen · PHP · Referenz · uasort

uasort

Funktion

Sortiert ein Array mittels einer benutzerdefinierten Vergleichsfunktion und behält dabei die Schlüssel-Wert-Zuordnungen (Index-Assoziationen) bei.

seit PHP 4.0.0 Kategorie: array

Signatur

uasort(array &$array, callable $callback): true

Beschreibung

uasort() sortiert ein Array anhand einer selbst definierten Vergleichsfunktion, wobei die Verknüpfung zwischen Schlüsseln und Werten erhalten bleibt. Das ist besonders wichtig bei assoziativen Arrays, bei denen die ursprünglichen Schlüssel (Strings oder Integers) nach der Sortierung weiterhin mit ihren Werten verknüpft sein sollen.

Die Vergleichs-Callback-Funktion erhält zwei Argumente (zwei Werte des Arrays) und muss einen Integer zurückgeben: einen negativen Wert, wenn das erste Argument kleiner als das zweite ist, 0 wenn beide gleich sind, und einen positiven Wert, wenn das erste Argument größer ist. Seit PHP 7.0 kann hierfür der Spaceship-Operator (<=>) sehr praktisch eingesetzt werden.

Im Gegensatz zu usort(), das die Schlüssel neu indiziert, und uksort(), das nach Schlüsseln sortiert, bietet uasort() die Möglichkeit, die Reihenfolge der Werte benutzerdefiniert festzulegen und dabei die ursprünglichen Schlüssel beizubehalten. Das ist z. B. beim Sortieren von assoziativen Datensätzen (z. B. aus Datenbanken) nach einem bestimmten Feld unverzichtbar.

Seit PHP 8.0 gibt die Funktion immer true zurück (zuvor konnte sie im Fehlerfall false zurückgeben). Das Array wird direkt verändert (In-place-Sortierung, call by reference).

Parameter

Name Typ Default Beschreibung
$array Pflicht array Das zu sortierende Array, das per Referenz übergeben wird. Es wird direkt verändert.
$callback Pflicht callable Eine benutzerdefinierte Vergleichsfunktion. Sie erhält zwei Werte des Arrays und muss einen int zurückgeben: negativ, wenn der erste Wert kleiner ist, 0 bei Gleichheit, positiv, wenn der erste Wert größer ist.

Rückgabewert

Typ
true
Beschreibung
Gibt seit PHP 8.0 immer true zurück. Das übergebene Array wird direkt (in-place) sortiert.

Beispiele

Assoziatives Array nach Alter sortieren

<?php
$personen = [
    'alice' => 30,
    'bob'   => 25,
    'carol' => 35,
    'dave'  => 28,
];

uasort($personen, function (int $a, int $b): int {
    return $a <=> $b;
});

foreach ($personen as $name => $alter) {
    echo $name . ': ' . $alter . PHP_EOL;
}
bob: 25 dave: 28 alice: 30 carol: 35

Datensätze nach einem verschachtelten Feld sortieren

<?php
$produkte = [
    'p3' => ['name' => 'Tastatur', 'preis' => 49.99],
    'p1' => ['name' => 'Monitor',  'preis' => 299.00],
    'p2' => ['name' => 'Maus',     'preis' => 19.99],
];

uasort($produkte, function (array $a, array $b): int {
    return $a['preis'] <=> $b['preis'];
});

foreach ($produkte as $id => $produkt) {
    echo $id . ': ' . $produkt['name'] . ' — ' . number_format($produkt['preis'], 2) . ' €' . PHP_EOL;
}
p2: Maus — 19,99 € p3: Tastatur — 49,99 € p1: Monitor — 299,00 €

Absteigend sortieren mit Spaceship-Operator

<?php
$punkte = [
    'team_a' => 45,
    'team_b' => 72,
    'team_c' => 60,
];

uasort($punkte, fn(int $a, int $b): int => $b <=> $a);

foreach ($punkte as $team => $p) {
    echo $team . ': ' . $p . ' Punkte' . PHP_EOL;
}
team_b: 72 Punkte team_c: 60 Punkte team_a: 45 Punkte

// Wichtig · Fallstricke

Stabilität: Seit PHP 8.0 ist die Sortierung stabil, d. h. Elemente mit gleichem Vergleichswert behalten ihre ursprüngliche Reihenfolge. In älteren PHP-Versionen war dies nicht garantiert.

Integer-Overflow: Bei numerischen Vergleichen sollte man nicht einfach $a - $b zurückgeben, da dies bei großen Integers zu einem Overflow führen kann. Stattdessen ist der Spaceship-Operator <=> (ab PHP 7.0) oder ein expliziter Vergleich mit if zu empfehlen.

Abgrenzung zu ähnlichen Funktionen: usort() sortiert ebenfalls benutzerdefiniert, setzt aber die Schlüssel neu (numerische Indizierung ab 0). uksort() sortiert benutzerdefiniert nach den Schlüsseln, nicht nach den Werten. asort() sortiert aufsteigend nach Werten und behält Schlüssel, aber ohne benutzerdefinierte Vergleichsfunktion.