Array Multisort in PHP: Ein umfassender Leitfaden
Erfahren Sie, wie array_multisort() in PHP parallele Arrays und mehrere Spalten gleichzeitig sortiert – mit Syntax, Beispielen und Vergleichen.
array_multisort() sortiert ein oder mehrere Arrays gleichzeitig. Die eigentliche Stärke liegt im Sortieren paralleler Arrays – mehrerer Arrays, die Spalten desselben Datensatzes darstellen – sodass beim Umsortieren eines Arrays alle anderen im Gleichschritt mitbewegt werden, damit die zusammengehörigen Zeilen ausgerichtet bleiben. Diese Seite behandelt die Syntax, Multi-Spalten-Sortierungen (Tiebreaking), den Fallstrick der Schlüssel-Neuindizierung und den Unterschied zu sort() und usort().
Syntax
array_multisort(
array &$array1,
mixed $array1_sort_order = SORT_ASC,
mixed $array1_sort_flags = SORT_REGULAR,
mixed ...$rest
): boolDie Argumente werden in Gruppen gelesen: Auf jedes Array kann optional eine Sortierreihenfolge-Konstante und eine Sortier-Flags-Konstante folgen. Die Funktion sortiert in-place (die Arrays werden per Referenz übergeben) und gibt bei Erfolg true, bei Misserfolg false zurück.
| Konstante | Wirkung |
|---|---|
SORT_ASC | Aufsteigend sortieren (Standard) |
SORT_DESC | Absteigend sortieren |
SORT_REGULAR | Elemente normal vergleichen (Standard) |
SORT_NUMERIC | Elemente als Zahlen vergleichen |
SORT_STRING | Elemente als Zeichenketten vergleichen |
Ein einzelnes Array sortieren
In seiner einfachsten Form verhält es sich wie sort() – es ordnet ein Array in-place:
$data = [3, 1, 2];
array_multisort($data);
print_r($data);Ausgabe:
Array
(
[0] => 1
[1] => 2
[2] => 3
)Parallele Arrays sortieren (der Hauptanwendungsfall)
Angenommen, Sie haben zwei per Index ausgerichtete Arrays – eines mit Altersangaben, eines mit Namen – und möchten nach Alter sortieren, wobei jeder Name mit seinem Alter verbunden bleibt. Übergeben Sie beide Arrays; das erste Array bestimmt die Reihenfolge, und jedes weitere Array wird auf die gleiche Weise umsortiert:
$ages = [25, 25, 30];
$names = ['John', 'Jane', 'Alice'];
array_multisort($ages, SORT_ASC, $names, SORT_ASC);
print_r($ages);
print_r($names);Ausgabe:
Array
(
[0] => 25
[1] => 25
[2] => 30
)
Array
(
[0] => Jane
[1] => John
[2] => Alice
)Beachten Sie den Tiebreaker: Beide 25-Jährigen behalten ihre Positionen, aber da ein zweites Array ($names, SORT_ASC) übergeben wurde, werden die Zeilen mit gleichem Alter nach Name geordnet – Jane vor John.
Nach mehreren Kriterien sortieren
Um Gleichstände aufzulösen, listen Sie Arrays in Prioritätsreihenfolge auf: Das erste Array ist das primäre Sortierschlüsselfeld, das nächste löst Gleichstände im ersten auf, und so weiter. Jedes Array erhält sein eigenes Reihenfolge-Flag, sodass Sie auf- und absteigende Spalten mischen können:
$volume = [67, 86, 85, 98, 86, 67];
$edition = [2, 1, 6, 2, 6, 7];
// Sort by volume DESC, then by edition ASC for equal volumes.
array_multisort($volume, SORT_DESC, $edition, SORT_ASC);
print_r($volume);
print_r($edition);Ausgabe:
Array
(
[0] => 98
[1] => 86
[2] => 86
[3] => 85
[4] => 67
[5] => 67
)
Array
(
[0] => 2
[1] => 1
[2] => 6
[3] => 6
[4] => 2
[5] => 7
)Die beiden 86er und die beiden 67er bleiben zusammen, und innerhalb jedes Gleichstands sind die Auflagen aufsteigend.
Ein Array von Zeilen nach einer Spalte sortieren
Reale Datensätze sind oft ein Array aus assoziativen Zeilen. Verwenden Sie array_column(), um die Spalten herauszuziehen, nach denen sortiert werden soll, und übergeben Sie das ursprüngliche Array zuletzt, damit es entsprechend umsortiert wird:
$rows = [
['name' => 'Bob', 'age' => 30],
['name' => 'Alice', 'age' => 25],
['name' => 'Carol', 'age' => 30],
];
$age = array_column($rows, 'age');
$name = array_column($rows, 'name');
// Primary: age ASC. Tie-break: name ASC.
array_multisort($age, SORT_ASC, $name, SORT_ASC, $rows);
print_r($rows);Ausgabe:
Array
(
[0] => Array ( [name] => Alice [age] => 25 )
[1] => Array ( [name] => Bob [age] => 30 )
[2] => Array ( [name] => Carol [age] => 30 )
)Fallstrick: Schlüssel werden neu indiziert
array_multisort() indiziert numerische Schlüssel neu (sie werden zu 0, 1, 2, …), aber String-Schlüssel bleiben erhalten. Wenn Sie die ursprünglichen Integer-Schlüssel beibehalten müssen, sortieren Sie eine Kopie der Schlüssel zusammen mit den Daten, oder verwenden Sie stattdessen eine schlüssel-bewusste Funktion wie asort().
Wann welche Sortierfunktion verwenden
- Verwenden Sie
array_multisort(), wenn Sie parallele Arrays haben oder eine Multi-Spalten-Sortierung benötigen. - Verwenden Sie
sort()/rsort()für ein einzelnes Array nach Wert, wenn Schlüssel keine Rolle spielen. - Verwenden Sie
ksort()/asort(), um nach Schlüssel oder nach Wert unter Beibehaltung der Schlüssel zu sortieren. - Verwenden Sie
usort(), wenn ein Array benutzerdefinierte Vergleichslogik benötigt (z. B. nach Stringlänge oder einem abgeleiteten Wert sortieren), die Flags nicht ausdrücken können.
Eine Übersicht über alle Sortierfunktionen finden Sie in der Sortierung von Arrays-Übersicht.
graph LR
A[Array] --> B[Array Multisort]
B --> C[Ascending/Descending Order]
B --> D[Sorting by Key]
B --> E[Sorting by Multiple Criteria]