Wykonaj funkcję dla każdego elementu tablicy

PHPPisząc w PHP często dane trzymam w obszernych tablicach – nic w tym dziwnego, gdyż bardzo ułatwiają pracę ze zmiennymi. Zalet tablic jest mnóstwo, m.in. możliwość sortowania, lecz drobną niedogodnością jest to, że nie możemy na tablicach wykonywać funkcji formatujących tekst (np. strip_tags() czy nl2br()), przez co jesteśmy zmuszeni używać pętli. Polecam w tym wypadku napisać sobie funkcję pomocniczą, dzięki której będziemy mogli użyć jako argumentu funkcji tablicę, podczas gdy funkcja wymusza podanie “normalnej” zmiennej.

Całość sprowadza się do skorzystania z pętli foreach() i dobrodziejstwa rekurencji. Rekurencja to w skrócie użycie funkcji wewnątrz niej samej (łatwo to wytłumaczyć na przykładzie silni, ale mniejsza z tym), dzięki temu bez problemu “przerobimy” wszystkie tablice zagnieżdżone.

Algorytm wygląda następująco:

  • jeśli nasz argument jest tablicą, przeglądamy jej zawartość i wykonujemy zadanie na każdym elemencie
  • jeśli nie jest tablicą, po prostu wywołujemy funkcję

Wystarczy jeden warunek i jedna pętla do osiągnięcia zamierzonego efektu. Dlaczego tak ważne jest sprawdzenie czy argument jest tablicą, skoro z założenia będziemy korzystali z tego rozwiązania tylko dla tablic? Ponieważ w ten sam sposób będziemy działać na zmiennych wewnątrz tablicy, aby sprawdzić czy tablica zawiera inne tablice.

Kod gotowej funkcji, którą nazwałem do_for_array():

function do_for_array($function, $array) {

	if(is_array($array)) {
		foreach($array as $id => $element) $array[$id] = do_for_array($function, $element);
	}
	else $array = $function($array);
	return $array;
	
}

$function – nazwa funkcji, z której chcemy skorzystać
$array – tablica wejściowa

Gdy mamy do dyspozycji gotowe narzędzie, możemy na przykład przygotować dane z formularza do zapisu w bazie:

$post = do_for_array('mysql_escape_string', $_POST);

Unikamy tym samym wielokrotnego stosowania mysql_escape_string(), co skraca kod i zmniejsza ryzyko wystąpienia jakiejś literówki, której szukanie mogłoby zająć sporo cennego czasu.

komentarze 2 do “Wykonaj funkcję dla każdego elementu tablicy”

  • Jacko pisze:

    Witaj,
    A nie sprawdzi się lepiej w tym przypadku funkcja array_map ?

    • Filip Klar pisze:

      W tym konkretnym przypadku tak, masz rację. Zapomniałem dodać w poście, że problem pojawi się przy tablicy wielowymiarowej – z taką array_map() będzie mieć kłopoty, dlatego mój sposób jest bardziej uniwersalny. W sumie można by pokusić się o rozwiązanie pośrednie – z pętlą, warunkiem i array_map().

Skomentuj

CommentLuv