# 4.10.6 Übersicht Sortierungsfunktionen

Es gibt verschiedene vordefinierte Funktionen in PHP, mit denen Arrays sortiert werden können. Diese Funktionen bekommen ein Array übergeben, sortieren dies nach einem bestimmten Algorithmus und geben ein neues Array mit sortiertem Inhalt zurück.

## Sortierfunktionen

Aufsteigend | Absteigend | Benutzerdefiniert | Funktion
--- | --- | --- | ---
sort() | rsort() | usort() | Sortiert die Werte eines Arrays und weist numerische Indizes zu. Die Zuordnung von Schlüssel zu Wert bleibt dabei nicht erhalten. Ein vorher assoziatives Array wird in ein indiziertes Array umgewandelt.
asort() | arsort() | uasort() | Die Funktion `asort()` sortiert ein assoziatives Array aufsteigend nach den Werten der Elemente. Die Zuordnung von Schlüssel zu Wert bleibt dabei erhalten.
ksort() | krsort() | uksort() | Die Funktion `ksort()` sortiert ein assoziatives Array aufsteigend nach den Schlüsseln. Die Beziehung zwischen Schlüssel und Wert bleibt erhalten.

Hinweis

Bei benutzerdefinierten Sortierungsfunktionen werden die Elemente mittels einer zuvor definierten Vergleichsfunktion sortiert. Syntax-Beispiel: `usort(Array, "Name der Vergleichsfunktion");`

## Beispiel für die Sortierungsfunktionen sort() & rsort()

Hier wird ein Beispiel für die häufig verwendeten Sortierfunktionen `sort()` und `rsort()` gezeigt. Wie wir am Beispiel sehen, sortieren die PHP-Funktionen das Array direkt, also ohne eine Zuweisung an ein anderes Array: also nur `sort($digits)` verwenden und nicht `$sortDigits = sort($digits)`.

Code

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    <?php
    $digits = [17, 19, 21, 15, 9, 13];
    $size = sizeof($digits);

    //unsortiert
    echo "unsortiert: ";
    for ($count = 0; $count < $size; $count++) {
        echo "$digits[$count] ";
    }

    //aufsteigend sortiert
    sort($digits);
    echo "<br>aufsteigend sortiert: ";
    for ($count = 0; $count < $size; $count++) {
        echo "$digits[$count] ";
    }

    //absteigend sortiert
    rsort($digits);
    echo "<br>absteigend sortiert: ";
    for ($count = 0; $count < $size; $count++) {
        echo "$digits[$count] ";
    }

Ausgabe:
unsortiert: 17 19 21 15 9 13
aufsteigend sortiert: 9 13 15 17 19 21
absteigend sortiert: 21 19 17 15 13 9

## Beispiel für die Sortierungsfunktion uksort()

Es macht Sinn, eine eigene Vergleichsfunktion zu verwenden, wenn die Entscheidung über die Sortierreihenfolge nicht trivial ist. Dann wird die Sortierung mit usort() oder uksort() durchgeführt.

Code

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    <?php
    function compare($one, $two)
    {
        if ($two > $one)  return 1;
        if ($two < $one)  return -1;
        if ($two == $one) return 0;
    }

    $digits = [4 => "vier", 3 => "drei", 20 => "zwanzig", 10 => "zehn"];
    uksort($digits, "compare");

    print_r($digits);
    echo "<br><br>";

    while (list($key, $value) = each($digits)) {
        echo "$key: $value<br>";
    }

Ausgabe:
Array ( [20] => zwanzig [10] => zehn [4] => vier [3] => drei )
20: zwanzig
10: zehn
4: vier
3: drei

Hinweis

Die Sortierung erfolgt nach den Schlüsseln, wobei die Zuordnung "Schlüssel-zu-Wert" erhalten bleibt.

Mit dem return-Wert 1, -1, oder 0 wird uksort() angewiesen, dass das zweite Argument größer, gleich oder kleiner ist als das erste Argument.

Wir sehen hier, dass in Zeile 9 die vordefinierte PHP-Funktion `uksort($digits, "compare")` die eigene Funktion `compare($one, $two)` aufruft. Die eigene Funktion `compare` wird dann auch als Callbacks / Callables bezeichnet.

Hinweis

Callables sind sehr interessant. Eine PHP-Funktion wird anhand ihres Namens als String übergeben, wie das Beispiel mit der Funktion `compare($one, $two)` zeigt, die als String übergeben wird an `uksort($digits, "compare")`.

Jede PHP-eigene Funktion (außer array(), echo, empty(), eval(), exit(), isset(), list(), print, unset()) und jede selbst erstellte Funktion kann für die Übergabe verwendet werden.