Sortierung eines 2D-Arrays nach Spalte in PHP: Ein Blick unter die Haube

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Die Magie der Sortierung: Wie PHP zweidimensionale Arrays ordnet

\n\n

Stellen Sie sich vor: Sie haben eine Tabelle mit Daten – eine Liste von Benutzern, Produkten oder Bestellungen. Sie müssen diese nach Alter, Preis oder Datum sortieren. In Excel geht das mit einem Klick. Und in PHP? Hier wird es richtig interessant. Die Frage "Sort a 2d array by a column value" auf Stack Overflow hat tausende Aufrufe nicht ohne Grund – es ist eine dieser Aufgaben, vor denen jeder Entwickler steht.

\n\n

Heute geben wir nicht einfach nur fertigen Code. Wir werfen einen Blick "unter die Haube" von PHP und verstehen, wie die Mechanismen der Sortierung mehrdimensionaler Arrays tatsächlich funktionieren. Sie erfahren, warum usort schneller als Schleifen ist, wie PHP Elemente vergleicht und welche Fallstricke auf Anfänger lauern. Los geht's!

\n\n

Das Problem: Warum ist die Sortierung eines 2D-Arrays nicht trivial?

\n\n

PHP hat sort() und asort() für eindimensionale Arrays. Aber wenn das Array zweidimensional wird (Array von Arrays), versagen die Standardfunktionen. Warum? Weil PHP nicht weiß, nach welcher "Spalte" (Schlüssel des inneren Arrays) Sie sortieren möchten.

\n\n

Hier ist ein typisches Beispiel:

\n\n
<?php\n$users = [\n    ['name' => 'Anna', 'age' => 25],\n    ['name' => 'Ivan', 'age' => 30],\n    ['name' => 'Maria', 'age' => 22]\n];\n// Wie sortiert man nach Alter?\n?>
\n\n

Einfach sort($users) aufrufen? Nein – PHP gibt eine Warnung aus und macht nicht das, was man will. Es braucht einen intelligenteren Ansatz.

\n\n

Lösung Nr. 1: Klassisches usort mit benutzerdefinierter Funktion

\n\n

Die beliebteste Methode ist die Verwendung von usort(). Diese Funktion nimmt ein Array und eine Callback-Funktion entgegen, die die Sortierreihenfolge bestimmt. Lassen Sie uns "unter die Haube" schauen.

\n\n

Wie funktioniert usort?

\n\n

Wenn Sie usort($array, $callback) aufrufen, macht PHP Folgendes:

\n
    \n
  • Es zerlegt das Array in Elementpaare.
  • \n
  • Für jedes Paar ruft es Ihre Callback-Funktion auf.
  • \n
  • Der Callback muss zurückgeben: eine negative Zahl (wenn das erste Element "kleiner" ist), Null (wenn gleich), eine positive Zahl (wenn das erste "größer" ist).
  • \n
  • Basierend auf diesen Antworten vertauscht PHP die Elemente mithilfe des Quicksort-Algorithmus oder einer Hybridvariante.
  • \n
\n\n

So sieht das im Code aus:

\n\n
<?php\n$users = [\n    ['name' => 'Anna', 'age' => 25],\n    ['name' => 'Ivan', 'age' => 30],\n    ['name' => 'Maria', 'age' => 22]\n];\n\nusort($users, function($a, $b) {\n    return $a['age'] - $b['age'];\n});\n\nprint_r($users);\n// Ergebnis: Maria (22), Anna (25), Ivan (30)\n?>
\n\n

Beachten Sie: Wir subtrahieren das Alter von $b von $a. Wenn $a['age'] kleiner ist, ist das Ergebnis negativ, und das Element $a kommt zuerst. Einfach wie das kleine Einmaleins.

\n\n

Fallstrick: Zeichenketten und Groß-/Kleinschreibung

\n\n

Wenn Sie nach einem Zeichenkettenfeld (z. B. Name) sortieren, funktioniert die Subtraktion nicht. Sie müssen strcmp() oder strcasecmp() für eine Groß-/Kleinschreibung-unabhängige Sortierung verwenden:

\n\n
<?php\nusort($users, function($a, $b) {\n    return strcmp($a['name'], $b['name']);\n});\n// Sortierung nach Name (Anna, Ivan, Maria)\n?>
\n\n

Aber seien Sie vorsichtig: strcmp() unterscheidet zwischen Groß- und Kleinschreibung. "apple" und "Apple" werden als unterschiedlich betrachtet. Wenn das kritisch ist – verwenden Sie strcasecmp().

\n\n

Lösung Nr. 2: array_multisort – mächtig, aber knifflig

\n\n

Die zweite beliebte Methode ist array_multisort(). Diese Funktion kann mehrere Arrays oder ein mehrdimensionales Array nach einer Spalte sortieren. "Unter der Haube" funktioniert sie anders: Sie extrahiert die Spalte, sortiert sie und ordnet dann die restlichen Arrays in derselben Reihenfolge um.

\n\n

So sieht das aus:

\n\n
<?php\n$users = [\n    ['name' => 'Anna', 'age' => 25],\n    ['name' => 'Ivan', 'age' => 30],\n    ['name' => 'Maria', 'age' => 22]\n];\n\n// Spalte 'age' extrahieren\n$ages = array_column($users, 'age');\n\n// Sortieren: $users wird nach $ages sortiert\narray_multisort($ages, SORT_ASC, $users);\n\nprint_r($users);\n// Ergebnis: Maria (22), Anna (25), Ivan (30)\n?>
\n\n

Diese Methode ist eleganter, wenn Sie mehrere Sortierkriterien haben (z. B. zuerst nach Alter, dann nach Name). Aber sie erfordert, dass Sie die Spalte vorher extrahieren – und das kann bei großen Arrays speicherintensiv sein.

\n\n

Was passiert "unter der Haube"? Ein Blick in den PHP-Kern

\n\n

Wenn Sie usort() oder array_multisort() aufrufen, verwendet PHP intern den Quicksort-Algorithmus (genauer: eine optimierte Version namens "LLVM libc++'s std::sort", die Introsort verwendet – eine Mischung aus Quicksort, Heapsort und Insertionsort).

\n\n

Das bedeutet:

\n
    \n
  • Durchschnittliche Komplexität: O(n log n)
  • \n
  • Schlimmster Fall: O(n²) (tritt selten auf, da Introsort auf Heapsort umschaltet)
  • \n
  • Speicher: O(log n) für den Aufrufstapel
  • \n
\n\n

PHP ruft Ihre Callback-Funktion für jeden Vergleich auf. Das ist der Grund, warum usort() bei sehr großen Arrays (100.000+ Elemente) langsamer sein kann als eine speziell optimierte Lösung. Aber für 99 % der Fälle ist es mehr als ausreichend.

\n\n

Zusammenfassung: Welche Methode ist die beste?

\n\n

Hier ist eine kurze Entscheidungshilfe:

\n
    \n
  • Einfach und lesbar: usort() mit einer anonymen Funktion – ideal für die meisten Fälle.
  • \n
  • Mehrere Kriterien: array_multisort() – wenn Sie nach mehreren Spalten sortieren müssen.
  • \n
  • Maximale Leistung: Verwenden Sie array_column() + array_multisort() – das ist oft schneller als usort() mit Callback.
  • \n
  • Exotische Sortierlogik: usort() mit einer benutzerdefinierten Klasse (Implementierung von __invoke()) – für komplexe Geschäftslogik.
  • \n
\n\n

Denken Sie daran: Die Wahl der Methode hängt von Ihren Daten und Anforderungen ab. Aber jetzt, wo Sie wissen, was "unter der Haube" passiert, können Sie eine fundierte Entscheidung treffen. Viel Erfolg beim Sortieren!

Blogs

Buchempfehlungen