POWRÓT NA STRONĘ SZKOŁY

Sortowanie tablic wielowymiarowych

W przypadku tablic wielowymiarowych, elementy są tablicami. Porównywanie dwóch tablic jest problematyczne. Musimy je zaimplementować "ręcznie", stosując kryteria stosowne do rozważanego przypadku.

Sortowanie za pomocą funkcji usort()

Często pomocna jest w takich sytuacjach funkcja usort() umożliwiająca sortowanie tablicy wielowymiarowej przy pomocy zdefiniowanej przez użytkownika funkcji porównującej. Literka u na początku nazwy jest od user - użytkownik, a więc mamy w tym przypadku sortowanie użytkownika. Podobnie jak w przypadku sort(), funkcja usort() tworzy nowe indeksy, więc nie nadaje się do tablic asocjacyjnych. Do tablic asocjacyjnych stosujemy analogicznie funkcje uasort() oraz uksort(), przy czym nie ma funkcji sortujących malejąco, ponieważ porządek sortowania określamy definiując funkcję porównującą.

Ćwiczenie 2_8_0_1. Sortowanie dwuwymiarowej tablicy indeksowanej numerycznie za pomocą funkcji usort()

Zastosuj następujący kod PHP:

<?php
  require_once('../moje_funkcje.php');
  function porownaj($element1, $element2)
  {
    return strcmp($element1[0], $element2[0]);
  }
  $zwierzeta=array(
                    array('pies','Reks','2'),
                    array('pies','Burek','6'),
                    array('świnka morska','Nerwusek',1),
                    array('kot','Puszek',4),
                    array('kot','Leniuch',5)
                  );
  usort($zwierzeta,'porownaj');
  pokaz_tablice($zwierzeta);
?>

Widzimy 5-elementową tablicę $zwierzeta, której elementy są tablicami 3-elementowymi. Są one rekordami tabeli, którą analizowaliśmy na poprzednich zajęciach (przykład 2). Zadanie polega na posortowaniu rosnąco tablicy według gatunków zwierząt, następnie jeżeli występują takie same gatunki - według ich imion i na końcu, jeżeli występują takie same gatunki o tych samych imionach - według wieku. Zwróć uwagę, że osiągamy takie same efekty jak w ćwiczeniu w zastosowaniu funkcji array_multisort(), tyle że teraz mamy tablicę wielowymiarową. Zastosowanie funkcji array_multisort() do tabeli dwuwymiarowej, przetestujemy dalej podczas tych zajęć. Jest jedna istotna różnica - usort() korzysta z tablicy, która w sposób naturalny odwzorowuje tabelę (kolejne jej elementy, to rekordy tabeli), natomiast w celu zastosowania array_multisort() musimy utworzyć tablice z kolejnych kolumn tabeli.

Funkcja porównująca (w ćwiczeniu jest to funkcja porownaj()), warunkuje porządek sortowania i jest niezbędna do zastosowania funkcji usort(). Porównanie dwóch kolejnych elementów zwraca liczbę ujemną albo zero, jeżeli sortowanie odbywa się w porządku rosnącym lub liczbę dodatnią albo zero - jeżeli sortujemy malejąco. Funkcja porownaj(), występuje jako argument funkcji usort(). Jest podana tylko nazwa pisana w apostrofach. Porównuje pierwsze elementy tablic - rekordów, w razie potrzeby (jeżeli są elementy o tej samej wartości) porównuje drugie, potem w razie potrzeby - trzecie, itd. Ponieważ w naszym ćwiczeniu wartości są stringami, zastosowano funkcję strcmp(), która porównuje dwa ciągi zgodnie z wymogami funkcji porównującej.

Ćwiczenie 2_8_0_2

Napisz własny skrypt PHP, prezentujący sortowanie malejąco, dwuwymiarowej tablicy asocjacyjnej. Zastosuj funkcje uasort() oraz uksort().

Sortowanie za pomocą funkcji array_multisort()

Wykonanie wygląda niemal identycznie jak w ćwiczeniu w którym sortowaliśmy kilka tablic jednowymiarowych. Różnica polega na połączeniu tych tablic w tablicę dwuwymiarową. Otrzymujemy tablicę kolumn tabeli, a nie jak w poprzednim ćwiczeniu tablicę wierszy. Skutek sortowania będzie identyczny.

Ćwiczenie 2_8_0_3. Sortowanie tablicy dwuwymiarowej za pomocą funkcji array_multisort()

Przetestuj działanie funkcji array_multisort(), stosując następujący kod PHP:

<?php
  require_once('../moje_funkcje.php');
  $zwierzeta=array(
                    array('pies','pies','świnka morska','kot','kot'),
                    array('Reks','Burek','Nerwusek','Puszek','Leniuch'),
                    array(2,6,1,4,5);
                  )
  array_multisort($zwierzeta[0],$zwierzeta[1],$zwierzeta[2]);
  pokaz_tablice($zwierzeta);
?>

Kończąc zagadnienie sortowania tablic przy pomocy funkcji wbudowanych, radziłbym zachować ostrożność. Jak zwykle "diabeł tkwi w szczegółach". Należy między innymi zwrócić uwagę na polskie znaki oraz sortowanie liczb jako stringów (np. '2' jest większe od '12').