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.