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.