Первая функция из золотой тройки называется 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
принимает первым параметром callback-функцию и вторым — коллекцию, которая будет отображаться. Дальше внутри себя array_map
делает перебор элементов переданной коллекции и для каждого элемента вызывает callback-функцию. На вход этой функции передаётся элемент исходного массива, а её результат записывается в новый массив, который и возвращается наружу. Некоторые замечания относительно функции 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
не знает, и ей этого знать не нужно. Ответственность за обработку лежит на пользователях.
Вам ответят команда поддержки Хекслета или другие студенты.
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.
Зарегистрируйтесь или войдите в свой аккаунт