PHP: Функции
Теория: Отображение
Первая функция из золотой тройки называется map. Ее название переводится на русский как отображение, что точно отражает суть этой операции. Если в программировании говорят об отображении, то всегда подразумевают функцию map. Ее можно найти практически в любом языке, и везде это будет одна и та же операция.
В PHP она имеет немного другое название — array_map.
Попробуем прийти к этой функции через примеры. Возьмем список пользователей из предыдущего урока и извлечем из него имена всех пользователей:
Здесь мы видим обычную агрегацию с использованием foreach.
В некоторых ситуациях можно использовать функцию array_column, которая возвращает массив значений по ключу.
А что если мы захотим извлечь возраст? Повторяем:
В примерах выше легко увидеть закономерность. Программа выполняет один и тот же проход по циклу и собирает результат в переменную $result. Единственное, что меняется — значение, которое мы извлекаем из элементов исходного массива. Именно этот паттерн называется отображением.
Теперь посмотрим, как выполнить ту же самую операцию с помощью array_map:
Функция array_map принимает два параметра:
- Колбэк-функцию
- Коллекцию, которая будет отображаться
Дальше внутри себя array_map делает перебор элементов переданной коллекции и для каждого элемента вызывает колбэк-функцию. На вход этой функции передается элемент исходного массива, а ее результат записывается в новый массив, который и возвращается наружу.
Проговорим несколько неочевидных моментов, связанных с array_map и операцией отображения:
- Возвращаемый массив всегда такого же размера, как и исходный, потому что
array_mapотображает каждый элемент исходного массива в элемент возвращаемого - Внутри анонимной функции можно выполнять любые вычисления, а не только возвращать часть исходного элемента
- Функция
array_mapполностью скрывает от нас наличие обхода и процесс сборки нового массива
Рассмотрим типичный пример, который любят приводить в документации функции map в разных языках программирования. Это применение некоторой арифметической операции к каждому элементу коллекции:
Пример выглядит искусственно, но хорошо отражает суть операции.
А теперь рассмотрим реализацию:
Перейдем к главному отличию myMap от ручного обхода массива. Дело в том, что функция myMap не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает первым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Функция myMap не знает, чем будет этот результат — ей этого знать не нужно. Ответственность за обработку лежит на пользователях.
.png)
