Start · Sprachen · PHP · Referenz · array_multisort

array_multisort

Funktion

Sortiert mehrere Arrays gleichzeitig oder ein mehrdimensionales Array nach einer oder mehreren Spalten.

seit PHP 4.0.0 Kategorie: array

Signatur

array_multisort(array &$array1, mixed $array1_sort_order = SORT_ASC, mixed $array1_sort_flags = SORT_REGULAR, mixed ...$rest): bool

Beschreibung

array_multisort() ermöglicht es, mehrere Arrays auf einmal zu sortieren, wobei die Reihenfolge der Elemente eines Arrays als Sortierkriterium für alle weiteren übergebenen Arrays gilt. Dies ist besonders nützlich, um tabellenartige Datensätze (z. B. Ergebnismengen aus Datenbanken) nach einer oder mehreren Spalten zu sortieren, ähnlich wie ORDER BY in SQL.

Die Funktion verändert die übergebenen Arrays direkt (in-place). Nach dem Pflicht-Array können optional die Sortierrichtung (SORT_ASC oder SORT_DESC) und Sortier-Flags (SORT_REGULAR, SORT_NUMERIC, SORT_STRING, SORT_NATURAL, SORT_LOCALE_STRING, SORT_FLAG_CASE) angegeben werden. Danach können beliebig viele weitere Arrays mit je eigenen Parametern folgen.

Beim Sortieren mehrdimensionaler Arrays extrahiert man häufig zunächst eine Spalte mit array_column(), sortiert diese und übergibt abschließend das Ursprungs-Array, damit es entsprechend umsortiert wird. Schlüssel-Zuordnungen bleiben nicht erhalten (numerische Schlüssel werden neu indiziert), assoziative Schlüssel werden hingegen beibehalten.

Wichtig: Alle übergebenen Arrays müssen dieselbe Anzahl von Elementen besitzen, andernfalls gibt die Funktion false zurück und die Arrays bleiben unverändert.

Parameter

Name Typ Default Beschreibung
$array1 Pflicht array Das erste zu sortierende Array. Wird als Referenz übergeben und direkt verändert.
$array1_sort_order int SORT_ASC Sortierrichtung für array1: SORT_ASC (aufsteigend) oder SORT_DESC (absteigend).
$array1_sort_flags int SORT_REGULAR Sortier-Flags für array1, z. B. SORT_REGULAR, SORT_NUMERIC, SORT_STRING, SORT_NATURAL, SORT_LOCALE_STRING oder SORT_FLAG_CASE.
$rest mixed Weitere Arrays (ebenfalls als Referenz) sowie optionale Sortierrichtungs- und Flag-Parameter, die jeweils dem direkt vorangehenden Array zugeordnet werden.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die Arrays unterschiedliche Längen haben).

Beispiele

Zwei Arrays synchron sortieren

<?php
$namen = ['Charlie', 'Alice', 'Bob'];
$alter = [30, 25, 28];

array_multisort($namen, SORT_ASC, SORT_STRING, $alter);

print_r($namen);
print_r($alter);
Array ( [0] => Alice [1] => Bob [2] => Charlie ) Array ( [0] => 25 [1] => 28 [2] => 30 )

Mehrdimensionales Array nach mehreren Spalten sortieren

<?php
$personen = [
    ['name' => 'Charlie', 'abteilung' => 'IT',  'gehalt' => 3200],
    ['name' => 'Alice',   'abteilung' => 'HR',  'gehalt' => 4100],
    ['name' => 'Bob',     'abteilung' => 'IT',  'gehalt' => 2900],
    ['name' => 'Diana',   'abteilung' => 'HR',  'gehalt' => 3800],
];

// Erst nach Abteilung (ASC), dann nach Gehalt (DESC) sortieren
$abteilung = array_column($personen, 'abteilung');
$gehalt    = array_column($personen, 'gehalt');

array_multisort(
    $abteilung, SORT_ASC,  SORT_STRING,
    $gehalt,    SORT_DESC, SORT_NUMERIC,
    $personen
);

foreach ($personen as $p) {
    echo "{$p['abteilung']} | {$p['name']} | {$p['gehalt']}\n";
}
HR | Alice | 4100 HR | Diana | 3800 IT | Charlie | 3200 IT | Bob | 2900

Natürliche Sortierung (SORT_NATURAL) für Dateinamen

<?php
$dateien = ['bild10.png', 'bild2.png', 'bild1.png', 'bild20.png'];

array_multisort($dateien, SORT_ASC, SORT_NATURAL);

print_r($dateien);
Array ( [0] => bild1.png [1] => bild2.png [2] => bild10.png [3] => bild20.png )

// Wichtig · Fallstricke

Schlüssel-Verhalten: Numerische Schlüssel werden nach dem Sortieren neu indiziert (beginnend bei 0). String-Schlüssel (assoziative Arrays) bleiben erhalten. Soll ein assoziatives Array sortiert werden, während die Schlüssel-Wert-Bindung erhalten bleibt, sollte alternativ uasort() oder usort() in Kombination mit einer benutzerdefinierten Vergleichsfunktion eingesetzt werden.

Gleiche Werte: Bei identischen Werten in der primären Sortierspalte entscheidet die Reihenfolge des nachfolgend übergebenen Arrays (sekundäres Sortierkriterium). Die ursprüngliche Reihenfolge gleichwertiger Elemente wird nicht zwingend beibehalten (instabile Sortierung in PHP < 8.0; seit PHP 8.0 ist die interne Sortierung stabil).

Performance: Bei sehr großen Datensätzen kann es effizienter sein, usort() mit einer Closure zu verwenden, da array_multisort() intern mehrere Hilfskopien der Arrays anlegt.