array_map($callback, $array) ruft $callback für jedes Element von $array auf und liefert ein neues Array mit den Ergebnissen. Der Callback kommt zuerst, das Array an zweiter Stelle, und das ursprüngliche Array bleibt unverändert.
fn($p) => $p * 1.2 ist eine Arrow Function: eine Funktion aus einem einzigen Ausdruck, die ihr Ergebnis zurückgibt. Jedes Callable funktioniert an ihrer Stelle.
Eine eingebaute Funktion als Callback verwenden
Übergib den Namen einer eingebauten Funktion als String. So räumst du am kürzesten ein ganzes Array auf: jeden Wert trimmen, Strings in Ganzzahlen umwandeln oder die Schreibweise ändern.
array_map('intval', ...) ist der übliche Weg, die Strings aus einem Formular oder aus explode() in echte Ganzzahlen umzuwandeln. Du kannst auch intval(...) schreiben, die First-Class-Callable-Syntax aus PHP 8.1, die dein Editor vervollständigen und prüfen kann.
Eine Closure mit äußeren Variablen verwenden
Eine Arrow Function sieht die Variablen um sie herum automatisch. Eine klassische function braucht use, um sie hereinzuholen. Beides wird auf der Seite zu anonymen Funktionen erklärt.
array_map mit Schlüsseln
Bei einem einzelnen Array behält array_map die Schlüssel, auch String-Schlüssel. Aber der Callback bekommt nur den Wert. Um auch den Schlüssel zu bekommen, übergibst du array_keys($array) als zweites Array: Der Callback wird dann mit je einem Element aus jedem Array aufgerufen.
Beachte das zweite Ergebnis: Sobald du mehr als ein Array übergibst, werden die Schlüssel durch 0, 1, 2 ersetzt. Deshalb baut die letzte Zeile sie mit array_combine() wieder auf.
Mehrere Arrays auf einmal mappen
Jedes zusätzliche Array wird zu einem zusätzlichen Argument des Callbacks, nach Position zugeordnet. Haben die Arrays unterschiedliche Längen, werden die kürzeren mit null aufgefüllt.
Wenn du null als Callback übergibst, wird keine Funktion aufgerufen, und die Arrays werden zu Paaren zusammengefügt:
array_map vs array_walk vs foreach
array_map baut ein neues Array. array_walk ändert das übergebene Array über eine Referenz und gibt dem Callback den Schlüssel als zweites Argument. Ein foreach kann beides und kann außerdem Elemente überspringen oder mit break früh aufhören.
Verwende array_map, wenn aus jedem Element genau ein neues Element wird. Wenn du außerdem Elemente weglassen musst, kombinierst du es mit array_filter oder schreibst ein foreach.
Typischer Fehler: die Reihenfolge der Argumente
array_map nimmt zuerst den Callback und dann das Array. Sein Nachbar array_filter nimmt sie umgekehrt, und das verwechselt man leicht:
array_map($callback, $array); // callback first
array_filter($array, $callback); // array first
Vertauscht man sie, wirft PHP 8 einen TypeError, weil ein einfaches Array kein gültiger Callback ist:
PHP stoppt mit:
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
Vertausche die beiden Argumente wieder, und der Block läuft.
Häufig gestellte Fragen
Was macht array_map in PHP?
Es ruft eine Funktion für jedes Element eines Arrays auf und liefert ein neues Array mit den Ergebnissen: array_map(fn($n) => $n * 2, [1, 2, 3]) liefert [2, 4, 6]. Das ursprüngliche Array bleibt unverändert.
Behält array_map die Schlüssel?
Bei einem Array ja: String- und Ganzzahl-Schlüssel bleiben, wie sie sind. Bei zwei oder mehr Arrays bekommt das Ergebnis immer neue Schlüssel 0, 1, 2....
Wie bekomme ich im Callback von array_map den Schlüssel?
Übergib die Schlüssel als zweites Array: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Das Ergebnis ist eine Liste, also setze es in array_combine(array_keys($arr), ...), wenn du die ursprünglichen Schlüssel zurückbrauchst.
Ist array_map schneller als foreach?
Nicht nennenswert. Beide laufen einmal über das Array, und ein einfaches foreach ist oft etwas schneller, weil es einen Funktionsaufruf pro Element spart. Nimm array_map, wenn es sich besser liest: eine Umwandlung, die ein neues Array erzeugt.
Was ist der Unterschied zwischen array_map und array_walk?
array_map liefert ein neues Array und lässt die Eingabe in Ruhe. array_walk liefert true und ist dafür gedacht, das Array über einen Referenzparameter direkt zu ändern: array_walk($arr, function (&$v, $k) { $v = trim($v); });.