Anty-sort, czyli robienie bałaganu w tablicy

Niedawno w Notatkach spisałem się na temat sortowania tablic. Są jednak takie sytuacje, w których potrzebujemy troszkę namieszać w tablicy – czyli wykonać dokładnie odwrotność sortowania. Jak zwykle PHP spieszy z pomocą dostarczając nam gotowej funkcji realizującej to zadanie. Funkcja ta zwie się shuffle(). Jak zwykle na początek szybki wgląd w dokumentację, cobyśmy wiedzieli z czym mamy do czynienia:
bool shuffle (array &$array)
Użycie funkcji jest bardzo proste:
$arr = array(1, 15, 3, 10, 'foo', 'baz' => 'bar', 'sally' => 'betty', 18);
shuffle($arr);
 
print_r($arr);
I to wszystko. Zauważmy, że shuffle() bierze tablicę przez referencję przez co operuje bezpośrednio na niej. Powyższy skrypt wyświetli coś w tym stylu (piszę „coś w tym stylu”, bo za każdym razem shuffle() miesza tablicę w inny sposób): Array ( [0] => foo [1] => 15 [2] => 3 [3] => 18 [4] => bar [5] => betty [6] => 1 [7] => 10 ) Widać wyraźnie, że nie zostały zachowane klucze – ani numeryczne, ani asocjacyjne. Jest pewien sprytny sposób by obejść ten problem. Zastosować musimy jeszcze jedną funkcję – array_keys():
array array_keys (array $input [, mixed $search_value [, bool $strict = false]])
Funkcja ta najprościej mówiąc zwraca tablicę, której elementami są klucze z przekazanej do niej tablicy $input. Jeśli podamy drugi opcjonalny argument $search_value tylko klucze odpowiadające jego wartości będą brane pod uwagę. W innym wypadku, wszystkie klucze są zwracane. Możemy podać jeszcze jeden argument, $strict, determinujący czy podczas porównywania kluczy z wartością $search_value funkcja ma stosować dokładne porównanie operatorem ===. Domyślnie klucze porównywane są za pomocą ==. A oto jak wykorzystamy tą funkcję do naszego pierwotnego celu:
$towns = array('krosno', 'krakow', 'przemysl', 'bielsko biala', 'tarnobrzeg', 'foo' => 'wroclaw');
$keys = array_keys($towns);
 
shuffle($keys);
 
foreach($keys as $key)
{
	$new_tab[$key] = $towns[$key];
}
 
print_r($new_tab);
Cały „trick” polega na tym, że mieszamy nie naszą docelową tablicę (w tym wypadku $towns), a tablicę utworzoną z jej kluczy. Następnie za pomocą zwykłego foreach() tworzymy nową tablicę $new_tab zawierającą odpowiednie powiązania klucz – wartość, takie jak w pierwotnej tablicy. Pisząc o tasowaniu elementów, a także wyciąganiu kluczy, trzeba wspomnieć także o jeszcze jednej funkcji, a mianowicie o array_rand(). Na pierwszy rzut oka można pomyśleć, że funkcja ta zwraca losowy element z tablicy. Tak jednak nie jest. Funkcja array_rand() zwraca losowo klucz, lub kilka kluczy z podanej do niej tablicy.
mixed array_rand (array $input [, int $num_req = 1])
Jak wynika z powyższej definicji, domyślnie funkcja zwraca nam jeden losowy klucz. Można to uściślić podając drugi argument $num_req.
$towns = array('krosno', 'krakow', 'przemysl', 'bielsko biala', 'tarnobrzeg', 'foo' => 'wroclaw');
$new_tab = array_rand($towns, 3);
 
print_r($new_tab);
Wynikiem działania funkcji będzie coś w rodzaju:
Array
(
    [0] => 1
    [1] => 2
    [2] => foo
)

, ,

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

*

Możesz użyć następujących tagów oraz atrybutów HTML-a: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">