PHP usort – sortowanie tablic na własnych zasadach!

Sortowanie elementów tablicy to rzecz trywialna. Istnieje przecież kilka funkcji PHP, które zrobią to optymalnie i szybko, nie zmuszając nas do zastanowienia. Czynność ta wydaje się bardzo prosta, póki nie trafimy na problem sortowania tablic wielowymiarowych lub tablic zawierających obiekty. Tego typu elementy potrafią być bardzo złożone, wykluczając jakiekolwiek automatyczne rozwiązanie. Jak poradzić sobie również i w tym wypadku?

 

W jaki sposób definiować kolejność elementów?

Wszystko sprowadza się do wartości zwracanej przez zdefiniowaną przez nas funkcję. Funkcja ta przyjmuje dwa argumenty, które są dwoma dowolnymi wartościami sortowanej tablicy. Naszym zadaniem jest wskazanie, która z nich według naszych kryteriów powinna znaleźć się na wcześniejszej, a która na dalszej pozycji po wykonaniu sortowania. W ten sposób parser PHP wykonując sortowanie będzie „wiedział”, jak szeregować znajdujące się w tablicy zmienne. Istnieją trzy możliwości:

  • jeśli zwrócona wartość jest mniejsza od zera – pierwsza zmienna jest „mniejsza” i powinna być umieszczona na wcześniejszym miejscu w tablicy wynikowej,
  • jeśli zwrócona wartość jest większa od zera – pierwsza zmienna jest „większa” i powinna znajdować się na dalszej pozycji w tablicy wynikowej,
  • jeśli zwrócona wartość to zero – wówczas oznaczamy obie zmienne jako równorzędne.

Celowo użyłem cudzysłowu przy słowach „mniejsza” i „większa”, aby zaznaczyć, że jest to tylko kwestia umowna. Może się przecież okazać, że sortowana tablica będzie zawierać dane, które nie będą numeryczne. Wówczas również można według pewnych kryteriów określić, jaką kolejność chcielibyśmy uzyskać, jednak nie może być już mowy o porównywaniu tych elementów tak, jak to się robi w przypadku liczb.

 

Przykład

W tym przypadku za kryterium sortowania przyjmiemy długość ciągu tekstowego – poszeregujemy je w kolejności od najdłuższego do najkrótszego:

// Tablica
$tab = array('To', 'jest', 'przykładowa', 'tablica', 'z', 'wyrazami');

// Funkcja sortująca
function sortLongestFirst($a, $b) {
    $lenA = strlen($a);
    $lenB = strlen($b);

    if ($lenA == $lenB) {
        return 0;
    }

    return ($lenA > $lenB) ? -1 : 1;
}

// Wywołanie
usort($tab, 'sortLongestFirst');

Prześledźmy na szybko działanie funkcji sortującej sortLongestFirst. Na początku pobieramy długość obu porównywanych zmiennych. Jeśli długości są sobie równe, wówczas zwracamy zero. Następnie sprawdzamy, czy długość pierwszego elementu jest większa niż długość drugiego. Jeśli tak, wówczas zwracamy -1, sytuując go na wcześniejszym miejscu, w przeciwnym razie 1 – oznaczając jako ten, który ma zająć dalszą pozycję.

 

Więcej informacji

  1. http://php.net/manual/en/function.usort.php