Sortieren eines Arrays nach Spaltenwert in PHP: Ein Leitfaden für alle, die das Googeln satt haben
\n\nHaben Sie jemals eine Situation erlebt, in der Sie eine Liste von Benutzern, Produkten oder Bestellungen als Array assoziativer Arrays haben und diese nach einem bestimmten Feld sortieren müssen? Sagen wir, nach Alter, Preis oder Registrierungsdatum. Wenn ja – Sie sind nicht allein. Diese Frage auf Stack Overflow hat Tausende von Aufrufen und Dutzende von Stimmen gesammelt. Und heute werden wir sie ein für alle Mal klären.
\n\nIn diesem Artikel zeigen wir nicht nur, wie usort und array_multisort funktionieren. Wir beantworten die häufigsten Fragen, die Entwickler haben: Wie sortiert man nach einem verschachtelten Schlüssel, wie behält man Schlüssel, wie sortiert man nach mehreren Feldern und was tut man, wenn die Daten aus einer Datenbank kommen.
Los geht's!
\n\nWas ist ein Array assoziativer Arrays und warum sollte man es sortieren?
\n\nStellen Sie sich vor, Sie haben eine Liste von Benutzern:
\n\n$users = [\n ['name' => 'Anna', 'age' => 25, 'city' => 'Moskau'],\n ['name' => 'Boris', 'age' => 30, 'city' => 'Sankt Petersburg'],\n ['name' => 'Viktor', 'age' => 22, 'city' => 'Kasan'],\n];\n\nDies ist ein typisches mehrdimensionales Array in PHP, bei dem jedes Element ein assoziatives Array mit denselben Schlüsseln ist. Oft muss eine solche Liste nach einem bestimmten Feld sortiert ausgegeben werden: nach Alter (aufsteigend), nach Name (alphabetisch) oder nach Stadt.
\n\nDie Standard-PHP-Funktionen wie sort() oder asort() helfen hier nicht – sie arbeiten mit einfachen Werten, nicht mit verschachtelten Strukturen. Es werden spezielle Werkzeuge benötigt.
Die beliebteste Methode: usort mit einer anonymen Funktion
\n\nWenn Sie Stack Overflow besuchen und die Diskussion "Sort an array of associative arrays by column value" öffnen, wird Ihnen in 90% der Fälle usort empfohlen. Das ist logisch: Die Funktion usort ermöglicht es, eine eigene Vergleichslogik für zwei Array-Elemente zu definieren.
Wie sortiert man ein Array nach einem Feld (Alter)
\n\nAngenommen, wir möchten unsere Benutzer nach Alter aufsteigend sortieren:
\n\n<?php\n$users = [\n ['name' => 'Anna', 'age' => 25, 'city' => 'Moskau'],\n ['name' => 'Boris', 'age' => 30, 'city' => 'Sankt Petersburg'],\n ['name' => 'Viktor', 'age' => 22, 'city' => 'Kasan'],\n];\n\nusort($users, function($a, $b) {\n return $a['age'] <=> $b['age'];\n});\n\nprint_r($users);\n?>\n\nErgebnis:
\nArray\n(\n [0] => Array ( [name] => Viktor [age] => 22 [city] => Kasan )\n [1] => Array ( [name] => Anna [age] => 25 [city] => Moskau )\n [2] => Array ( [name] => Boris [age] => 30 [city] => Sankt Petersburg )\n)\n\nBeachten Sie: Wir verwenden den Raumschiff-Operator <=> (spaceship), der in PHP 7 eingeführt wurde. Er gibt -1, 0 oder 1 zurück, was ideal für Sortierfunktionen ist. Wenn Sie absteigend sortieren möchten, tauschen Sie einfach $a und $b:
usort($users, function($a, $b) {\n return $b['age'] <=> $a['age'];\n});\n\nSortierung nach einem String-Feld (Name)
\n\nBei Strings ist es genauso einfach. Möchten Sie die Benutzer alphabetisch nach Namen sortieren? Bitte sehr:
\n\nusort($users, function($a, $b) {\n return strcmp($a['name'], $b['name']);\n});\n\nOder verwenden Sie wieder <=> – es funktioniert auch mit Strings:
usort($users, function($a, $b) {\n return $a['name'] <=> $b['name'];\n});\n\nHäufige Fragen und Stolperfallen
\n\n1. Wie sortiert man nach einem verschachtelten Schlüssel?
\n\nManchmal haben Daten eine tiefere Struktur. Zum Beispiel hat jeder Benutzer ein Array profile