PHP-Arrays sortieren mit benutzerdefinierter Funktion, Unterschied usort, uasort und uksort
Die PHP-Bibliothek hat eine große Anzahl von Funktionen, welche das Sortieren von Arrays erleichtern. Die usort-Funktionen bieten die Möglichkeit, zur Sortierung eigene Methoden zu verwenden. Hier zeige ich wie man diese mithilfe anonymer Funktionen (Closures) anwendet.
Es gibt 3 Funktionen, welche alle gleiche Parameter, aber unterschiedliche Auswirkung haben:
- usort: Sortiert das Array, behält aber die Schlüssel nicht bei
- uasort: Sortiert das Array, behält aber die Schlüssel
- uksort: Sortiert das Array nach den Schlüsseln
Sehen wir uns an wie man die Funktion usort grundsätzlich benutzen kann:
$test = array(10 => 100, 20 => 50, 30 => 300); usort($test, function($val1, $val2) { return ($val1 < $val2) ? -1 : 1; }); print_r($test); /* Ausgabe: Array ( [0] => 50 [1] => 100 [2] => 300 ) */
Wir können also eine Vergleichsfunktion direkt übergeben (anonyme Funktion), welche als Parameter 2 Werte aus dem Array erhält und als Rückgabe je nachdem welcher Wert größer ist 1 oder -1 zurück gibt. Wie wir weiters sehen, hat usort unsere Schlüssel (Indexe) neu gesetzt.
Im Vergleich dazu würde uasort folgendes Ergebnis liefern:
$test = array(10 => 100, 20 => 50, 30 => 300); uasort($test, function($val1, $val2) { return ($val1 < $val2) ? -1 : 1; }); print_r($test); /* Array ( [20] => 50 [10] => 100 [30] => 300 )*/
Hier bleiben die Index-Assoziationen also erhalten.
Mit uksort können wir das Array nach den Schlüsseln sortieren:
$test = array(30 => 12, 20 => 100, 50 => 300); uksort($test, function($val1, $val2) { return ($val1 < $val2) ? -1 : 1; }); print_r($test); /* Array ( [20] => 100 [30] => 12 [50] => 300 )*/
Was anonyme Funktionen noch ermöglichen, ist Variablen außerhalb der Funktion zu vererben und darauf zuzugreifen. Hierzu ein Beispiel anhand der usort-Funktion:
$test = array('Anton', 'Berta', 'Heinrich', 'Markus'); $sortByLetter = 1; usort($test, function($val1, $val2) use ($sortByLetter) { return ($val1[$sortByLetter] < $val2[$sortByLetter]) ? -1 : 1; }); print_r($test); /* Array ( [0] => Markus [1] => Berta [2] => Heinrich [3] => Anton )*/
Hier verwenden wir innerhalb der anonymen Funktion die Variable $sortByLetter, und sortieren somit nach dem 2. Buchstaben (String-Indizierung beginnt in PHP bei 0!).
Man kann den usort-Funktionen aber auch Sortier-Funktionen übergeben und muß nicht anonyme Funktionen verwenden. Hier ein Beispiel:
$test = array('Berta', 'Anton', 'Heinrich', 'Markus'); function cmp($val1, $val2) { return strcmp($val1, $val2); } usort($test, 'cmp'); print_r($test); /* Array ( [0] => Anton [1] => Berta [2] => Heinrich [3] => Markus )*/
Hier habe ich außerdem die Funktion strcmp zum Vergleichen verwendet, welche 2 Strings vergleicht und den richtigen Rückgabewert für die Sortier-Funktionen liefert.