Первая функция из золотой тройки называется map
. Ее название переводится на русский как отображение, что точно отражает суть этой операции. Если в программировании говорят об отображении, то всегда подразумевают функцию map
. Ее можно найти практически в любом языке, и везде это будет одна и та же операция.
В PHP она имеет немного другое название — array_map.
Попробуем прийти к этой функции через примеры. Возьмем список пользователей из предыдущего урока и извлечем из него имена всех пользователей:
<?php
$users = [
['name' => 'Igor', 'age' => 19],
['name' => 'Danil', 'age' => 1],
['name' => 'Vovan', 'age' => 4],
['name' => 'Matvey', 'age' => 16],
];
$result = [];
foreach ($users as ['name' => $name]) {
$result[] = $name;
}
print_r($result); // => ['Igor', 'Danil', 'Vovan', 'Matvey']
// Альтернативный вариант
$result = array_column($users, 'name');
print_r($result); // => ['Igor', 'Danil', 'Vovan', 'Matvey']
Здесь мы видим обычную агрегацию с использованием foreach
.
В некоторых ситуациях можно использовать функцию array_column
, которая возвращает массив значений по ключу.
А что если мы захотим извлечь возраст? Повторяем:
<?php
$result = [];
foreach ($users as ['age' => $age]) { // destructuring
$result[] = $age;
}
print_r($result); // => [19, 1, 4, 16]
В примерах выше легко увидеть закономерность. Программа выполняет один и тот же проход по циклу и собирает результат в переменную $result
. Единственное, что меняется — значение, которое мы извлекаем из элементов исходного массива. Именно этот паттерн называется отображением.
Теперь посмотрим, как выполнить ту же самую операцию с помощью array_map
:
<?php
$names = array_map(fn($user) => $user['name'], $users);
print_r($names); // => ['Igor', 'Danil', 'Vovan', 'Matvey']
Функция array_map
принимает два параметра:
- Колбэк-функцию
- Коллекцию, которая будет отображаться
Дальше внутри себя array_map
делает перебор элементов переданной коллекции и для каждого элемента вызывает колбэк-функцию. На вход этой функции передается элемент исходного массива, а ее результат записывается в новый массив, который и возвращается наружу.
Проговорим несколько неочевидных моментов, связанных с array_map
и операцией отображения:
- Возвращаемый массив всегда такого же размера, как и исходный, потому что
array_map
отображает каждый элемент исходного массива в элемент возвращаемого - Внутри анонимной функции можно выполнять любые вычисления, а не только возвращать часть исходного элемента
- Функция
array_map
полностью скрывает от нас наличие обхода и процесс сборки нового массива
Рассмотрим типичный пример, который любят приводить в документации функции map
в разных языках программирования. Это применение некоторой арифметической операции к каждому элементу коллекции:
<?php
$numbers = [5, 2, 3];
// Возводим в квадрат каждое число
$newNumbers = array_map(fn($number) => $number ** 2, $numbers);
print_r($newNumbers); // => [25, 4, 9]
Пример выглядит искусственно, но хорошо отражает суть операции.
А теперь рассмотрим реализацию:
<?php
function myMap(callable $callback, $coll)
{
$result = [];
foreach ($coll as $item) {
$result[] = $callback($item);
}
return $result;
}
Перейдем к главному отличию myMap
от ручного обхода массива. Дело в том, что функция myMap
не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает первым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Функция myMap
не знает, чем будет этот результат — ей этого знать не нужно. Ответственность за обработку лежит на пользователях.
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.