Warum die Sortierung assoziativer Arrays eine Herausforderung ist (und wie man sie löst)
\n\nStellen Sie sich vor: Sie haben eine Liste von Benutzern aus einer Datenbank abgerufen. Jeder hat einen Namen, ein Alter, eine Stadt und eine Bewertung. Die Daten liegen als Array assoziativer Arrays vor. Und dann sagt der Chef: „Sortiere nach Alter und dann noch nach Bewertung in absteigender Reihenfolge.“ Kommt Ihnen das bekannt vor? Wenn Sie schon einmal in PHP programmiert haben, sind Sie sicherlich auf die Aufgabe gestoßen: sort an array of associative arrays by column value. Die Frage mit tausenden von Aufrufen auf Stack Overflow lügt nicht – das ist ein echter Stolperstein für viele Entwickler.
\n\nIn diesem Artikel werden wir alle Methoden zur Sortierung mehrdimensionaler Arrays in PHP durchgehen. Vom einfachen usort bis zum leistungsstarken array_multisort. Sie erfahren, wie Sie nach einem Feld, nach mehreren Feldern, in verschiedenen Richtungen sortieren und wie Sie Fallstricke mit Datentypen vermeiden. Los geht's!
Das Problem: Warum die normale sort() nicht funktioniert
\n\nAngenommen, wir haben folgendes Array:
\n\n<?php\n$users = [\n ['name' => 'Анна', 'age' => 25, 'rating' => 4.7],\n ['name' => 'Иван', 'age' => 30, 'rating' => 3.9],\n ['name' => 'Мария', 'age' => 22, 'rating' => 4.9],\n];\n?>\n\nWenn Sie sort($users) versuchen, gibt PHP eine Warnung aus und lässt das Array unverändert. Warum? Weil sort() die Elemente direkt vergleicht und PHP nicht weiß, wie es assoziative Arrays vergleichen soll. Es braucht einen Hinweis – welches Feld als Sortierkriterium dienen soll.
Methode Nr. 1: usort() – der König der benutzerdefinierten Sortierung
\n\nDie Funktion usort() nimmt ein Array und eine Callback-Funktion entgegen, die zwei Elemente vergleicht. Dies ist die flexibelste und am häufigsten verwendete Methode.
Sortierung nach einem Feld (aufsteigend)
\n\n<?php\nusort($users, function($a, $b) {\n return $a['age'] <=> $b['age'];\n});\n// Ergebnis: Мария (22), Анна (25), Иван (30)\n?>\n\nDer Operator <=> (Raumschiff) wurde in PHP 7 eingeführt und macht den Code sauberer. Er gibt -1, 0 oder 1 in Abhängigkeit vom Vergleich zurück. Wenn Sie absteigend sortieren möchten, tauschen Sie einfach $a und $b:
<?php\nusort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n// Ergebnis: Иван (30), Анна (25), Мария (22)\n?>\n\nSortierung nach einem String-Feld
\n\nBei Strings funktioniert es genauso, aber denken Sie an die Locale. Wenn Sie russische Namen sortieren, verwenden Sie setlocale() und strcoll() für die korrekte Verarbeitung von Kyrillisch:
<?php\nsetlocale(LC_ALL, 'ru_RU.UTF-8');\nusort($users, function($a, $b) {\n return strcoll($a['name'], $b['name']);\n});\n?>\n\nMethode Nr. 2: array_multisort() – für die Sortierung nach mehreren Spalten
\n\nWenn Sie zuerst nach einem Feld und dann nach einem anderen sortieren müssen (z. B. nach Stadt und innerhalb der Stadt nach Alter), erfordert usort komplexe Logik. Hier kommt array_multisort() zur Hilfe.
Sortierung nach zwei Feldern
\n\n<?php\n$ages = array_column($users, 'age');\n$ratings = array_column($users, 'rating');\narray_multisort($ages, SORT_ASC, $ratings, SORT_DESC, $users);\n?>\n\nLassen Sie uns die Magie entschlüsseln: Wir erstellen separate Arrays aus den benötigten Spalten und übergeben sie dann an array_multisort. Wichtig: Das ursprüngliche Array wird als letztes übergeben – es wird entsprechend der Reihenfolge der ersten Arrays neu sortiert. Dies ist ein mächtiges, aber gefährliches Werkzeug: Wenn die Spalten unterschiedliche Längen haben, erhalten Sie einen Fehler.
Methode Nr. 3: array_column() + sort() – ein Hack für Einzeiler
\n\nWenn Sie ein Array einfach nach einem numerischen Feld sortieren müssen, können Sie eine Kombination aus array_column() und array_multisort() in einer Zeile verwenden:
<?php\narray_multisort(array_colum