Lekcje >> Podstawy PHP
Polimax

Drukarnia w Warszawie realizująca druk wizytówek, plakatów jak również fotoksiążki, fotoobrazy i fotokalendarze - z wysyłką na terenie całego kraju.

Sortowanie tablic jednowymiarowych

Podczas tych zajęć będziemy sortować tablice, wykorzystując funkcje wbudowane.

Sortowanie jednowymiarowej tablicy indeksowanej numerycznie za pomocą funkcji sort()

Funkcja bool sort (array &$tablica[,STALA]), zwraca true, jeżeli zakończy się powodzeniem, natomiast w przypadku wystapienia błędu - false. Zmiany w tablicy są przekazywane przez referencję. STALA, to opcjonalnie jedna ze stałych:

  • SORT_REGULAR - porównuje elementy normalnie (nie zmienia typów)
  • SORT_NUMERIC - porównuje elementy jako liczby
  • SORT_STRING - porównuje elementy jako ciągi tekstowe

Pierwsza z nich, jest wartością domyślną i nie musimy jej pisać. Funkcja sort(), służy do sortowania tablic jednowymiarowych. Co bardzo ważne, przypisuje nowe klucze dla elementów po sortowaniu. Wszystkie istniejące wcześniej klucze zostaną usunięte. Tak więc można ją sosować to tablic indeksowanych numerycznie, co więcej - należy zachować ostrożność przy sortowaniu tą funkcją tablic o różnych typach elementów, ponieważ może to doprowadzić do nieprzewidzianych wyników. Jeszcze jedna uwaga - omawiana funkcja sortuje rosnąco.

Ćwiczenie 2_7_0_1. Sortowanie jednowymiarowej tablicy indeksowanej numerycznie za pomocą funkcji sort()

w skryptach będziemy korzystać z funkcji, którą należy umieścić umieszczonej w pliku moje_funkcje.php:

function pokaz_tablice($t)
{
  echo '<pre>'."\n";    
  print_r($t);
  echo "\n".'</pre>';
}

Skrypt testujący funkcję sort():

<?php
  require_once('../moje_funkcje.php');
  
  $t1=array('jabłka','cytryny','gruszki','porzeczki');
  $t2=array('k1'=>'jabłka','k2'=>'cytryny','k3'=>'gruszki','k4'=>'porzeczki');
  $t3=array(2,12,9,8);
  $t4=array(2,12,9,8);
  
  sort($t1);
  sort($t2);
  sort($t3);
  sort($t4,SORT_STRING);
  
  pokaz_tablice($t1);
  pokaz_tablice($t2);
  pokaz_tablice($t3);
  pokaz_tablice($t4);
?>

Wszystkie tablice zostały posortowane rosnąco. Tablice $t3 oraz $t4 są identyczne, jednak wynik sortowania jest różny. Dlaczego? Otóż liczby 2 i 12, potraktowane jako liczby zostaną posortowane w kolejności 2, 12, natomiast potraktowane jako stringi, zostaną ustawione odwrotnie.

Proszę zwrócić uwagę na to, że tablice posortowane są ideksowane od zera. Tak więc indeksy się zmieniły. W przypadku tablic asocjacyjnych, zmiana kluczy jest niedopuszczalna, dlatego do sortowania tych tablic służą inne funkcje.

Sortowanie jednowymiarowych tablic asocjacyjnych za pomocą funkcji asort() oraz ksort()

Definicje tych funkcji są podobne do omówionej wcześniej funkcji sort(), z tą różnicą, że funkcja asort() sortuje według wartości elementów, natomiast ksort() - według kluczy. Obie sortują rosnąco i co ważne - zachowują oryginalne indeksy i klucze.

Ćwiczenie 2_7_0_2. Sortowanie jednowymiarowej tablicy asocjacyjnej za pomocą funkcji asort()

Wykonaj ponownie poprzednie ćwiczenie, zamieniając funkcję sort(), na funkcję asort():

<?php
  require_once('../moje_funkcje.php');
  
  $t1=array('jabłka','cytryny','gruszki','porzeczki');
  $t2=array('k1'=>'jabłka','k2'=>'cytryny','k3'=>'gruszki','k4'=>'porzeczki');
  $t3=array(2,12,9,8);
  $t4=array(2,12,9,8);
  
  asort($t1);
  asort($t2);
  asort($t3);
  asort($t4,SORT_STRING);
  
  pokaz_tablice($t1);
  pokaz_tablice($t2);
  pokaz_tablice($t3);
  pokaz_tablice($t4);
?>

Zwróć uwagę, że tablice zostały posortowane (zgodnie z oczekiwaniem) identycznie jak w poprzednim ćwiczeniu, tylko tym razem elementy zachowały swoje klucze.

Ćwiczenie 2_7_0_3. Sortowanie jednowymiarowej tablicy asocjacyjnej za pomocą funkcji ksort()

Wykonaj ponownie poprzednie ćwiczenie, zamieniając funkcję asort(), na funkcję ksort():

<?php
  require_once('../moje_funkcje.php');
  
  $t1=array('jabłka','cytryny','gruszki','porzeczki');
  $t2=array('k1'=>'jabłka','k2'=>'cytryny','k3'=>'gruszki','k4'=>'porzeczki');
  $t3=array(2,12,9,8);
  $t4=array(2,12,9,8);
  
  ksort($t1);
  ksort($t2);
  ksort($t3);
  ksort($t4,SORT_STRING);
  
  pokaz_tablice($t1);
  pokaz_tablice($t2);
  pokaz_tablice($t3);
  pokaz_tablice($t4);
?>

Zwróć uwagę, że tablice zostały posortowane według kluczy w kolejności 'k1', 'k2', 'k3', 'k4'. Elementy tablic indeksowanych numerycznie, nie zmieniły kolejności.

Sortowanie jednowymiarowych tablic asocjacyjnych, malejąco

Wszystkie zaprezentowane powyżej funkcje sortują rosnąco. Każda z nich ma swój odpowiednik sortujący malejąco.

  • sort() - rosnąco, rsort() - malejąco
  • asort() - rosnąco, arsort() - malejąco
  • ksort() - rosnąco, krsort() - malejąco

Ćwiczenie 2_7_0_4

Przetesuj wg. własnego pomysłu, funkcje sortujące malejąco.

Sortowanie tablic tworzących tabelę

W poprzednich ćwiczeniach sortowaliśmy pojedyncze tablice. Co zrobić, kiedy mamy wiele tablic, które są tworzą tabelę, tak jak to jest w bazach danych? Załóżmy, że sortujemy tabele jak w przykładach:

Przykłady sortowania tabel
Rysunek 1. Przykłady sortowania tabel

W pokazanych przykładach mamy sortowanie w porządku rosnącym. Jeżeli chcemy posortować tabelę, to musimy ją sortować według wskazanej kolumny, przy czym sortowanie nie może zmienić żadnego z rekordów (wierszy) tabeli. Zwróć uwagę, że zarówno przed, jak i po sortowaniu, kot nadal nazywa się Puszek i ma 4 lata, pies nazywa się Reks i ma dwa lata, natomiast świnka morska Nerwusek ma nadal 1 tok. Dane poszczególnych rekordów znajdujące się w tej samej kolumnie tworzą jednowymiarową tablicę. W przykładzie 1 będą to następujace tablice:

  • $zwierze=array('pies','świnka morska','kot')
  • $imie=array('Reks','Nerwusek','Puszek')
  • $wiek=array(2,1,4)

Posortowanie tabeli według kolumny zwierzę, sprowadza się do posortowania tablicy $zwierze, którą nazwijmy priorytetową i takiego poprzestawiania elementów pozostałych tablic, aby zachować rekordy pies-Reks-2, świnka morska-Nerwusek-1, kot-Puszek-4.

W przykładzie 2 mamy dwa psy (a także dwa koty). Który pies powinien być pierwszy a który drugi? Musimy mieć jakieś kryterium, będzie nim w naszym przykładzie imię. A co by było, gddyby dwa psy miały takie same imiona? Należałoby wziąć pod uwagę wiek, a gdyby dwa psy miały takie same imiona i miały taki sam wiek, to należałoby wziąć jeszcze inne kryterium itd. W przykładzie 2, musimy wykonać trzy sortowania:

  1. Sortowanie tablic:
    • $zwierze=array('pies','pies','świnka morska','kot','kot')
    • $imie=array('Reks','Burek','Nerwusek','Puszek','Leniuch')
    • $wiek=array(2,6,1,4,5)
    gdzie tabelą priorytetową jest $zwierze
  2. Sortowanie tablic:
    • $zwierze=array('kot','kot')
    • $imie=array('Puszek','Leniuch')
    • $wiek=array(4,5)
    gdzie tabelą priorytetową jest $imie
  3. Sortowanie tablic:
    • $zwierze=array('pies','pies')
    • $imie=array('Reks','Burek')
    • $wiek=array(2,6)
    gdzie tabelą priorytetową jest $imie

Teraz powinniśmy już rozumieć, na czym polega sortowanie tabel. Poznając odpowiednie funkcje wbudowane będziemy opierać się o te przykłady.

Uwaga! Proszę rozróżniać dwie sytuacje:

  • Tablice jednowymiarowe przechowują dane tabeli. Każda z tablic jest wtedy kolejnym rekordem (wierszem) tabeli. Najlepiej utworzyć z tych tablic tablicę dwuwymiarową - kolejny jej element, to kolejny rekord.
  • Tablice jednowymiarowe, służące do sortowania tabeli. Tablice są wtedy odpowiednikami kolumn tabeli. W tym przypadku, również wygodne jest utworzenie tablicy dwuwymiarowej, w której kolejny element będzie tym razem kolejną kolumną tabeli.

Sortowanie za pomocą funkcji array_multisort()

Do sortowania tablic tworzących tabelę służy array_multisort(). Omawiamy podczas tych zajęć sortowanie tablic jednowymiarowych więc potraktujemy tabelę, jako kilka tablic, stanowiących kolejne kolumny tabeli. Podczas, następnych zajęć zajmiemy się tablicami dwuwymiarowymi, więc sortowaną tabelę potraktujemy jak tablicę dwuwymiarową.

Podczas sortowania tą funkcją indeksy numeryczne są zmieniane, natomiast klucze opisowe są zachowywane.

Składnia tej funkcji jest następująca:
array_multisort(tablica1,sposób sortowania,typ sortowania,tablica2,tablica3...), gdzie

sposoby sortowania to:

  • SORT_ASC - w porządku rosnącym;
  • SORT_DESC - w porządku malejącym;

natomiast podstawowe typy sortowania to:

  • SORT_REGULAR - porównuj elementy normalnie;
  • SORT_NUMERIC - porównuj elementy numerycznie;
  • SORT_STRING - porównuj elementy jak stringi.

Pokazane wyżej stałe są opcjonalne, jeżeli nie są podane, przyjmowane są parametry domyślne: sortowanie w porządku rosnącym, podczas porównywania elementów, stringi brane są jako stringi, a liczby jako liczby.

Funkcja zwraca true lub false w przypadku niepowodzenia.

Ćwiczenie 2_7_0_5. Sortowania wielu tablic jednowymiarowych za pomocą funkcji array_multisort(), przy zastosowaniu domyślnych parametrów sortowania

Przetestuj działanie funkcji array_multisort(), wykonując sortowanie pokazane w przykładzie 2. Zastosuj następujący kod PHP:

<?php
  require_once('../moje_funkcje.php');
	
  $zwierze=array('pies','pies','świnka morska','kot','kot');
  $imie=array('Reks','Burek','Nerwusek','Puszek','Leniuch');
  $wiek=array(2,6,1,4,5);

  array_multisort($zwierze,$imie,$wiek);
  
  pokaz_tablice($zwierze);
  pokaz_tablice($imie);
  pokaz_tablice($wiek);
?>

Sprawdź, czy wynik sortowania jest zgodny z sortowaniem tabeli. Jeżeli nie rozumiesz mechanizmu tego sortowania, to przeanalizuj ponownie sortowanie tabeli pokazane w przykładach 1 i 2.

Ćwiczenie 2_7_0_6. Sortowania wielu tablic jednowymiarowych za pomocą funkcji array_multisort(), przy zastosowaniu własnych parametrów sortowania

Zmodyfikuj kod PHP z poprzedniego ćwiczenia, do postaci:

<?php
  require_once('../moje_funkcje.php');
	
  $zwierze=array('pies','pies','świnka morska','kot','kot');
  $imie=array('Reks','Burek','Nerwusek','Puszek','Leniuch');
  $wiek=array(2,6,1,4,5);

  array_multisort($zwierze,SORT_DESC,$imie,SORT_ASC,$wiek);
  
  pokaz_tablice($zwierze);
  pokaz_tablice($imie);
  pokaz_tablice($wiek);
?>

Tym razem tabela priorytetowa ($zwierze), została posortowana malejąco, natomiast drugie sortowanie ustawiło imiona psów i kotów w porządku rosnącym.