Menu

array_map() w PHP: funkcja na każdym elemencie tablicy

array_map($callback, $array) wywołuje callback na każdym elemencie i zwraca nową tablicę z wynikami. Poznaj funkcje strzałkowe, klucze, mapowanie kilku tablic naraz i sytuacje, w których lepiej pasuje array_walk lub foreach.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

array_map($callback, $array) wywołuje $callback na każdym elemencie $array i zwraca nową tablicę z wynikami. Najpierw callback, potem tablica, a oryginalna tablica pozostaje bez zmian.

fn($p) => $p * 1.2 to funkcja strzałkowa: funkcja z jednym wyrażeniem, która zwraca jego wynik. W jej miejscu zadziała dowolny callable.

Funkcja wbudowana jako callback

Przekaż nazwę funkcji wbudowanej jako string. To najkrótszy sposób na uporządkowanie całej tablicy: przytnij każdą wartość, zamień stringi na liczby całkowite albo zmień wielkość liter.

array_map('intval', ...) to zwykły sposób na zamianę stringów z formularza lub z explode() w prawdziwe liczby całkowite. Możesz też napisać intval(...), składnię first-class callable z PHP 8.1, którą twój edytor potrafi podpowiedzieć i sprawdzić.

Domknięcie ze zmiennymi z zewnątrz

Funkcja strzałkowa automatycznie widzi otaczające ją zmienne. Klasyczne function potrzebuje use, aby je wciągnąć. Oba rodzaje wyjaśnia strona o funkcjach anonimowych.

array_map z kluczami

Przy jednej tablicy array_map zachowuje klucze, także tekstowe. Callback dostaje jednak tylko wartość. Aby dostać też klucz, przekaż array_keys($array) jako drugą tablicę: callback jest wtedy wywoływany z jednym elementem z każdej tablicy.

Zwróć uwagę na drugi wynik: gdy tylko przekażesz więcej niż jedną tablicę, klucze są zastępowane przez 0, 1, 2. Dlatego ostatnia linia odbudowuje je przez array_combine().

Mapowanie kilku tablic naraz

Każda dodatkowa tablica staje się dodatkowym argumentem callbacku, dopasowanym po pozycji. Jeśli tablice mają różne długości, krótsze są uzupełniane wartością null.

Przekazanie null jako callbacku pomija funkcję i łączy tablice w pary:

array_map vs array_walk vs foreach

array_map buduje nową tablicę. array_walk zmienia przekazaną tablicę przez referencję i podaje callbackowi klucz jako drugi argument. foreach potrafi jedno i drugie, a do tego może pomijać elementy lub zakończyć się wcześniej przez break.

Używaj array_map, gdy każdy element zamienia się w dokładnie jeden nowy element. Jeśli musisz też odrzucić część elementów, połącz go z array_filter albo napisz foreach.

Częsty błąd: kolejność argumentów

array_map przyjmuje najpierw callback, a potem tablicę. Sąsiednia array_filter przyjmuje je odwrotnie, co łatwo pomylić:

array_map($callback, $array);     // callback first
array_filter($array, $callback);  // array first

Zamiana sprawia, że PHP 8 rzuca TypeError, bo zwykła tablica nie jest poprawnym callbackiem:

PHP zatrzymuje się z komunikatem:

PHP Fatal error:  Uncaught TypeError: array_map(): Argument #1 ($callback) must be a valid callback or null, array callback must have exactly two members in /home/index.php:4

Zamień argumenty z powrotem, a blok się wykona.

Najczęściej zadawane pytania

Co robi array_map w PHP?

Wywołuje funkcję na każdym elemencie tablicy i zwraca nową tablicę z wynikami: array_map(fn($n) => $n * 2, [1, 2, 3]) zwraca [2, 4, 6]. Oryginalna tablica się nie zmienia.

Czy array_map zachowuje klucze?

Przy jednej tablicy tak: klucze tekstowe i całkowite pozostają bez zmian. Przy dwóch lub więcej tablicach wynik zawsze dostaje nowe klucze 0, 1, 2....

Jak dostać klucz w callbacku array_map?

Przekaż klucze jako drugą tablicę: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Wynik jest listą, więc otocz go przez array_combine(array_keys($arr), ...), jeśli potrzebujesz z powrotem oryginalnych kluczy.

Czy array_map jest szybsze od foreach?

Nie w odczuwalny sposób. Obie przechodzą po tablicy raz, a zwykłe foreach bywa odrobinę szybsze, bo omija wywołanie funkcji dla każdego elementu. Wybierz array_map, gdy czyta się lepiej: jedno przekształcenie, które tworzy nową tablicę.

Czym różni się array_map od array_walk?

array_map zwraca nową tablicę i nie rusza danych wejściowych. array_walk zwraca true i służy do zmiany tablicy w miejscu przez parametr przekazywany przez referencję: array_walk($arr, function (&$v, $k) { $v = trim($v); });.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ