Sortierung eines Objekt-Arrays in PHP: Vom Chaos zur Ordnung in 5 Minuten
\n\nStellen Sie sich vor: Sie schreiben eine Bildungswebsite in PHP und haben eine Liste von Studenten aus der Datenbank erhalten. Jeder Student ist ein Objekt mit Name, Alter und Punktzahl. Sie müssen sie auf der Seite ausgeben: zuerst die Ältesten oder umgekehrt die Jüngsten. Oder vielleicht alphabetisch sortieren. Wie machen Sie das, wenn Sie kein einfaches Zahlen-Array, sondern ein Array von Objekten haben?
\n\nDiese Frage ist eine der beliebtesten auf Stack Overflow. Tausende Entwickler, vom Anfänger bis zum Profi, stehen vor der Aufgabe „sort array of objects by one property“. Und heute werden wir sie ein für alle Mal klären. Ohne Umschweife, mit lebendigen Beispielen und verständlichen Erklärungen.
\n\nWarum funktioniert die normale sort() nicht?
\n\nAngenommen, wir haben ein Array von Objekten $students:
<?php\nclass Student {\n public $name;\n public $age;\n public $score;\n\n public function __construct($name, $age, $score) {\n $this->name = $name;\n $this->age = $age;\n $this->score = $score;\n }\n}\n\n$students = [\n new Student("Anna", 22, 85),\n new Student("Ivan", 20, 92),\n new Student("Maria", 23, 78),\n new Student("Petr", 21, 95)\n];\n?>\n\nWenn Sie versuchen, sort($students) aufzurufen, gibt PHP einen Fehler aus oder tut einfach nichts. Warum? Weil sort() Zahlen und Zeichenfolgen vergleichen kann, aber nicht weiß, wie man zwei Objekte vergleicht. Man muss ihr erklären: „Vergleiche nach der Eigenschaft age“ oder „Vergleiche nach name“. Dafür gibt es in PHP eine spezielle Funktion – usort().
Lernen Sie usort() kennen – Ihr wichtigstes Werkzeug
\n\nDie Funktion usort() akzeptiert zwei Argumente: das Array selbst und eine Vergleichsfunktion. Diese Vergleichsfunktion muss zurückgeben:
- \n
- 0, wenn die Elemente gleich sind; \n
- eine negative Zahl, wenn das erste Element kleiner als das zweite ist; \n
- eine positive Zahl, wenn das erste Element größer als das zweite ist. \n
Hört sich kompliziert an? In der Praxis ist es einfach. Sortieren wir die Studenten nach Alter (aufsteigend):
\n\n<?php\nusort($students, function($a, $b) {\n return $a->age <=> $b->age;\n});\n\n// Ergebnis: Ivan (20), Petr (21), Anna (22), Maria (23)\n?>\n\nBeachten Sie den Operator <=> (Raumschiff). Er wurde in PHP 7 eingeführt und macht die Sortierung extrem prägnant. Er vergleicht zwei Werte und gibt -1, 0 oder 1 zurück. Genau das, was usort() braucht.
Absteigende Sortierung: Vorzeichen ändern
\n\nMöchten Sie vom Ältesten zum Jüngsten sortieren? Tauschen Sie einfach die Operanden im Operator <=> aus:
\n\n<?php\nusort($students, function($a, $b) {\n return $b->age <=> $a->age; // jetzt wird b mit a verglichen\n});\n\n// Ergebnis: Maria (23), Anna (22), Petr (21), Ivan (20)\n?>\n\nOder, was dasselbe ist, multiplizieren Sie das Ergebnis mit -1:
\n\n<?php\nusort($students, function($a, $b) {\n return -($a->age <=> $b->age);\n});\n?>\n\nSortierung nach Zeichenfolgen (alphabetisch)
\n\nUnd wenn die Eigenschaft eine Zeichenfolge ist? Zum Beispiel der Name. Das gleiche Prinzip, aber anstelle von <=> verwenden wir strcmp() oder strcasecmp() (für die Groß-/Kleinschreibung unabhängige Vergleiche):
<?php\n// Alphabetisch (A-Z)\nusort($students, function($a, $b) {\n return strcmp($a->name, $b->name);\n});\n\n// Ergebnis: Anna, Ivan, Maria, Petr\n\n// Alphabetisch (Z-A) — umgekehrte Reihenfolge\nusort($students, function($a, $b) {\n return strcmp($b->name, $a->name);\n});\n?>\n\nSortierung nach einer numerischen Eigenschaft: Alternative zu <=>
\n\nDer Operator <=> ist praktisch, aber wenn Sie mit altem PHP (vor 7.0) arbeiten, gibt es ihn nicht. Dann schreiben wir den Vergleich manuell: