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').