PHP

Sortowanie tablicy PHP

Daniel Wlaźlak
Programowanie - ilustracja artykułu
(Programowanie - ilustracja artykułu : envato, autor seventyfourimages)

Sortowanie tablic jest jednym z podstawowych zadań programistycznych, które często pojawiają się podczas pracy z PHP. Chociaż samo sortowanie może wydawać się prostą operacją, PHP oferuje wiele funkcji i technik, które mogą znacznie ułatwić, a czasami nawet skomplikować, to zadanie. PHP ma kilka predefiniowanych i użytecznych funkcji, które służą do sortowania tablic (array). Za bardzo niczym to nie wyróżnia języka PHP od innych języków programowania, bo praktycznie każdy daje jakieś mechanizmy pozwalające sortować swoje tablice i listy.

Podchodząc do typu array w PHP, trzeba pamiętać, że tablice PHP mają  dużą wszechstronność i są dwa rodzaje wbudowanych tablic:

  • zwykłe tablice jednowymiarowe, indeksowane kolejno klasycznie liczbami całkowitymi od zera,
  • tablice asocjacyjne, które mają swoje klucze, co czyni z nich praktycznie mapami (nazewnictwo takie będzie łatwiej przyswajalne dla osób mających styczność z innymi językami programowania).

Podział na dwa rodzaje tablic,  ma swoje odwzorowanie w funkcjach sortujących, jedne są odpowiednie dla  tablic zwykłych, drugie posortują nam poprawnie tablice asocjacyjne. 

Tablicę można oczywiście posortować rosnąco lub malejąco, PHP dodatkowo radzi sobie z sortowaniem alfabetycznym i numerycznym. Mamy też możliwość przekazania swojej funkcji porównującą elementy tablicy. Dzięki funkcji porównującej elementy tablicy z łatwością posortujemy w PHP tablice wielowymiarowe, według wybranego klucza.

Warto również wspomnieć na początku, że funkcje sortujące przyjmują tablice poprzez referencje, czyli działają na oryginalnych danych. Tablica podana jako zmienna do funkcji już staje się posortowana, nie przekazujemy jej przez wartość zwracaną z funkcji. Jeżeli popełnimy taki błąd, to zmienna otrzyma wartość true, jako wynik powiedzenia się sortowania tablicy (rzadziej false, gdyby sortowanie się nie powiodło), a nie całą tablicę z danymi.

Funkcje sortujące tablice w PHP

sort() – dzięki tej funkcji posortujesz zwykłe tablice (nie asocjacyjne, czyli bez klucza) w kolejności alfabetycznej od najniższej wartości do najwyższej wartości.  Funkcja sort() przyjmuje jeden parametr, czyli tablicę (array), i trzeba pamiętać, że wymaga, aby przekazywany parametr był typu array, w przeciwnym przypadku zgłosi błąd „PHP Warning:  sort() expects parameter 1 to be array, string given in…” Pamiętaj również, żeby nie sortować tablicy asocjacyjnej funkcją array, bo sort() nie zgłosi błędu, ale pozbędzie się Twoich kluczy, sortując tablicę, ale wartości przypisując co kluczy liczbowych zaczynających się od zera. Rzadko, ale czasami taka konwersja może przydać się w Twoich aplikacjach.

Przykładowy kod sortowania za pomocą funkcji sort() znajdziesz poniżej

<?php
 $dogBreeds = array("bocker", "afador", "akbash", "mastador");
 sort($dogBreeds );
 foreach ($dogBreeds  as $item) {
     echo $item ."\n";
 }
?>

rsort() - sortuje zwykłe tablice (nie asocjacyjne) w odwróconej kolejnośc

asort()  - jeżeli chcesz posortować tablice asocjacyjne, zachowując przy tym przypisanie wartości  do kluczy, to funkcja ta jest zdecydowanie dla Ciebie. asort() posortuję tablicę po wartościach od najmniejszej do największej, zachowując przy tym przypisanie do pierwotnych kluczy.

<?php
 
$dogBreeds = array(
"mom dog" => "bocker",
"dad dog" => "afador",
"my dog" =>  "akbash", 
"sister dog" =>  "mastador" );
sort($dogBreeds );

foreach ($dogBreeds  as $key => $value) {
     echo $key . ‘ ’ . $value."\n";
 }
 
?> ​

arsort() – to funkcja działająca jak asort() , tylko sortuje tablicę od wartości największych do najmniejszych.

ksort() – czasami chcemy posortować naszą tablicę asocjacyjną według kluczy i ksort() sprawdzi się tutaj doskonale.

uasort() – funkcja ta przyjmuje jako drugi parametr nazwę naszej funkcji sortującej (polecamy używanie tutaj funkcji anonimowej). Dzięki temu rozwiązaniu możemy sortować tablice wielowymiarowe, sortować tablicę po jednym z kluczy, czy nawet sortować tablice po wartościach obiektów trzymanych w zmiennych tablicy. W logice funkcji sortujących znakomicie odnajduje się, wprowadzony w PHP 7, operator Spaceship. Callback, czyli funkcja sortująca wymaga zwracania trzech wyników, 0, kiedy dwie porównywane wartości są równe ($a==$b), -1 kiedy  $a jest mniejsze niż $b oraz jeden, kiedy $b jest mniejsze niż $a. Operator spaceship skraca cały zapis. 

<?php

$members = [

["first_name" => "Tom", "last_name" => "Land"],
["first_name" => "Daniel", "last_name" => "Nowak"],
["first_name" => "Jakub", "last_name" => "Kowalski"],

];

usort($members, function($a, $b) {


return $a["last_name"] <=> $b["last_name"];



});

Różnorodność funkcji sortujących

Tych funkcji sortujących jest jeszcze więcej, odsyłam oczywiście do dokumentacji PHP. 

  • PHP oferuje wiele funkcji do sortowania, takich jak sort(), asort(), ksort(), usort(), uksort(), uasort(), natsort(), natcasesort(), array_multisort().
  • Każda funkcja ma swoje specyficzne zastosowanie, np. sortowanie według wartości, kluczy, z zachowaniem asocjacji klucz-wartość lub sortowanie naturalne.

Algorytmy sortowania w PHP

  • Od wersji PHP 5.3.0 wewnętrzne funkcje sortujące wykorzystują hybrydowy algorytm Timsort, który jest zoptymalizowany dla danych częściowo posortowanych.
  • Jest to wydajna kombinacja sortowania przez scalanie (merge sort) i sortowania przez wstawianie (insertion sort).

Zachowanie kluczy podczas sortowania

  • Funkcje takie jak sort() i rsort() reindeksują klucze, co oznacza, że asocjacje klucz-wartość zostaną utracone.
  • Aby zachować klucze, należy użyć funkcji takich jak asort() i arsort(), które sortują według wartości, ale utrzymują oryginalne klucze.

Sortowanie wielowymiarowych tablic

  • Sortowanie wielowymiarowych tablic w PHP może być skomplikowane, ale z pomocą przychodzi funkcja array_multisort().
  • Pozwala ona na sortowanie wielu tablic jednocześnie lub na sortowanie tablicy wielowymiarowej według wartości przypisanych do określonego klucza.

Własne funkcje porównujące

  • Funkcje takie jak usort(), uasort() i uksort() pozwalają na definiowanie własnych funkcji porównujących.
  • Użycie tych funkcji daje programiście pełną kontrolę nad kryteriami sortowania, co jest szczególnie przydatne przy sortowaniu złożonych struktur danych.

Sortowanie naturalne

  • PHP oferuje funkcję natsort(), która implementuje tzw. "sortowanie naturalne".
  • Sortowanie naturalne porządkuje ciągi znaków w sposób bardziej intuicyjny dla człowieka, np. "str2" zostanie umieszczony przed "str10".

Kwestie wydajności

  • Wydajność sortowania w PHP może się różnić w zależności od używanej funkcji i rozmiaru danych.
  • Dla dużych zbiorów danych warto rozważyć wybór odpowiedniej funkcji sortującej oraz testowanie wydajności na swoich przykładach.

Sortowanie z wykorzystaniem metody Schwartziana

  • Technika Schwartziana, popularna w Perlu, polega na minimalizacji liczby wywołań funkcji porównującej poprzez transformację danych przed sortowaniem.
  • W PHP można ją zaimplementować ręcznie, co może zwiększyć wydajność sortowania bardziej złożonych struktur danych.

Stabilność sortowania

  • Większość funkcji sortujących w PHP nie gwarantuje stabilności sortowania, co oznacza, że oryginalna kolejność równych elementów może zostać zmieniona.
  • Jeśli stabilność sortowania jest istotna, należy to uwzględnić, np. przez modyfikację algorytmu porównującego.

Sortowanie obiektów

  • PHP pozwala na sortowanie tablic zawierających obiekty za pomocą własnych funkcji porównujących.
  • Funkcja porównująca może odwoływać się do właściwości obiektów, co daje możliwość sortowania według wybranych kryteriów, np. wartości konkretnej właściwości obiektu.

Czy ten artykuł był Ci pomocny? Jesteśmy doświadczoną agencją SEO, skontakuj się z nami, jeśli potrzebujesz pomocy ze swoją stroną.

Prowadziłem i rozwijałem działy SEO w bardzo dużych wydawnictwach (Agora, gazeta.pl). Specjalizuję się w tworzeniu kompleksowych rozwiązań zasięgowych oraz programowaniu. @wlazlak

Spotkajmy się też w moich social media :
Zobacz moje wszystkie artykuły
Zaufali nam:
ElbudBis
Instytu cyfrowego obywatelstwa
Kinesso
Fundacja Orange
Rodzice.pl

Współpracuj z nami!

Naszą mocą jest technologia i doświadczony zespół

Przez lata zdobywaliśmy doświadczenie u największych wydawców w Polsce, a teraz zadbamy o rozwój Twojej firmy od strategii wzrostu po wdrożenia na stronach dzięki naszemu własnemu software house'owi. Zaufaj nam, aby osiągać dobre wyniki.

Porozmawiajmy o Twoich celach i potrzebach!

Przejrzyj najnowsze artykuły i wpisy na naszym blogu