168 PHP i MySQL dla każdego
Ponieważ porządkowanie leksykograficzne nie zawsze daje wyniki zgodne z intuicją człowieka, w PHP4 wprowadzono dodatkowe funkcje, które umożliwiają porównywanie zgodne z tzw. porządkiem naturalnym (ang. natural order). Są to strnatcmp i strnatca-secmp. Ich działanie jest analogiczne do funkcjonowania omawianych wyżej funkcji, z tą różnicą, że wykorzystywany jest inny algorytm porównujący. Zaleta porządkowania naturalnego ujawni się np. w sytuacji, kiedy będziemy sortować nazwy plików zawierających ich numery; ilustruje to kod widoczny na listingu 6.9.
Listing 6.9. Wykorzystanie funkcji strcmp i strnatcmp do sortowania ciągów
<?php
Iplikil = $pliki2 - array(
"pl1k2.zip".
"plikl0.zip".
"plik84.zip".
"plik22.zip".
"plik5.zip"
):
echoCPrzed sortowaniem:<br>"); foreach($pli ki 1 as Splik) echo("$plik "); usort($plikil. "strcmp"):
echo("<br><br>Po sortowaniu z użyciem strcmp:<br>“); foreach($plikil as Splik) echoCSpUk "): usort($pliki2. "strnatcmp");
echo("<br><br>Po sortowaniu z użyciem strnatcmp:<br>"): foreach<Spliki2 as Splik) echoCSplik ");
Przykładowe nazwy plików zostały zapisane w tablicy, a następnie posortowane na dwa różne sposoby. Efekt działania skryptu obrazuje rysunek 6.8. W pierwszej kolejności została wyświetlona zawartość tablicy przed sortowaniem — poszczególne elementy są nieuporządkowane. Następnie zostały wyświetlone wyniki sortowania, w którym jako funkcję porównującą wykorzystano funkcję strcmp (por. opis funkcji usort w rozdziale 4.), oraz wyniki sortowania, w którym jako funkcja porównująca została użyta funkcja strnatcmp. Różnica między porządkiem leksykograficznym a naturalnym jest tu bardzo wyraźna.
Rysunek 6.8.
Różnice między porządkiem leksykograficznym a naturalnym
joijsI
0* Edycja SSdak Przełaź JakJa*l Sarzpdzia Pcmcę
- - & r> | *tp:Mocalho5<,««.php ^ © Idź |j&
# Rozpocznij przygód... C Sktualno&l
Przed sortowaniem:
plik2.zip plikl0.zip plik84.zip plik22.zip plik5.zip
Po sortowaniu z użyciem strcmp: plikl0.zip plik2.zip plik22.zip plik5.zip plik84.zip
Po sortowaniu z użyciem strnatcmp: plik2.zip plik5.zip plikl0.zip plik22.zip plik84.zip