Menu

PHP array_map(): применить функцию к каждому элементу

array_map($callback, $array) вызывает колбэк для каждого элемента и возвращает новый массив результатов. Стрелочные функции, ключи, обработка нескольких массивов сразу и когда лучше подходят array_walk или foreach.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

array_map($callback, $array) вызывает $callback для каждого элемента $array и возвращает новый массив с результатами. Сначала идёт колбэк, потом массив, а исходный массив остаётся без изменений.

fn($p) => $p * 1.2 это стрелочная функция: функция из одного выражения, которая возвращает его результат. На её месте может быть любой callable.

Встроенная функция в качестве колбэка

Передайте имя встроенной функции строкой. Это самый короткий способ привести в порядок весь массив: обрезать пробелы у каждого значения, превратить строки в целые числа или сменить регистр.

array_map('intval', ...) это обычный способ превратить строки из формы или explode() в настоящие целые числа. Можно написать и intval(...), синтаксис first-class callable из PHP 8.1, который редактор умеет автодополнять и проверять.

Замыкание с внешними переменными

Стрелочная функция видит окружающие переменные автоматически. Классической function нужен use, чтобы их захватить. Оба варианта объяснены на странице об анонимных функциях.

array_map с ключами

С одним массивом array_map сохраняет ключи, в том числе строковые. Но колбэк получает только значение. Чтобы получить и ключ, передайте array_keys($array) вторым массивом: тогда колбэк вызывается с одним элементом из каждого массива.

Обратите внимание на второй результат: как только передано больше одного массива, ключи заменяются на 0, 1, 2. Поэтому последняя строка восстанавливает их через array_combine().

Несколько массивов сразу

Каждый дополнительный массив становится дополнительным аргументом колбэка, элементы сопоставляются по позиции. Если длины массивов разные, короткие дополняются значениями null.

Если передать null вместо колбэка, функция не вызывается, а массивы склеиваются попарно:

array_map, array_walk и foreach

array_map строит новый массив. array_walk меняет переданный массив через ссылку и даёт колбэку ключ вторым аргументом. foreach умеет и то, и другое, а ещё может пропускать элементы или останавливаться раньше через break.

Используйте array_map, когда каждый элемент превращается ровно в один новый элемент. Если часть элементов нужно ещё и отбросить, сочетайте её с array_filter или напишите foreach.

Частая ошибка: порядок аргументов

array_map принимает сначала колбэк, а потом массив. Её соседка array_filter принимает их в обратном порядке, и их легко перепутать:

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

Если поменять их местами, PHP 8 выбросит TypeError, потому что обычный массив не является допустимым колбэком:

PHP останавливается с сообщением:

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

Верните аргументы на место, и блок заработает.

Часто задаваемые вопросы

Что делает array_map в PHP?

Вызывает функцию для каждого элемента массива и возвращает новый массив с результатами: array_map(fn($n) => $n * 2, [1, 2, 3]) возвращает [2, 4, 6]. Исходный массив не меняется.

Сохраняет ли array_map ключи?

С одним массивом да: строковые и целочисленные ключи остаются как есть. С двумя и более массивами результат всегда получает новые ключи 0, 1, 2....

Как получить ключ внутри колбэка array_map?

Передайте ключи вторым массивом: array_map(fn($k, $v) => "$k=$v", array_keys($arr), $arr). Результат будет списком, поэтому оберните его в array_combine(array_keys($arr), ...), если нужны исходные ключи.

array_map быстрее foreach?

Не заметно. Оба проходят массив один раз, и обычный foreach часто чуть быстрее, потому что обходится без вызова функции на каждый элемент. Выбирайте array_map, когда так читается лучше: одно преобразование, которое даёт новый массив.

Чем array_map отличается от array_walk?

array_map возвращает новый массив и не трогает входной. array_walk возвращает true и предназначена для изменения массива на месте через параметр-ссылку: array_walk($arr, function (&$v, $k) { $v = trim($v); });.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ