HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Первая функция из золотой тройки называется map. Ее название переводится на русский как<strong>отображение</strong>, что точно отражает суть этой операции. Если в программировании говорят об отображении, то всегда подразумевают функцию map. Ее можно найти практически в любом языке, и везде это будет одна и та же операция.</p>
1 <p>Первая функция из золотой тройки называется map. Ее название переводится на русский как<strong>отображение</strong>, что точно отражает суть этой операции. Если в программировании говорят об отображении, то всегда подразумевают функцию map. Ее можно найти практически в любом языке, и везде это будет одна и та же операция.</p>
2 <p>В PHP она имеет немного другое название -<a>array_map</a>.</p>
2 <p>В PHP она имеет немного другое название -<a>array_map</a>.</p>
3 <p>Попробуем прийти к этой функции через примеры. Возьмем список пользователей из предыдущего урока и извлечем из него имена всех пользователей:</p>
3 <p>Попробуем прийти к этой функции через примеры. Возьмем список пользователей из предыдущего урока и извлечем из него имена всех пользователей:</p>
4 <p>Здесь мы видим обычную агрегацию с использованием foreach.</p>
4 <p>Здесь мы видим обычную агрегацию с использованием foreach.</p>
5 <p>В некоторых ситуациях можно использовать функцию array_column, которая возвращает массив значений по ключу.</p>
5 <p>В некоторых ситуациях можно использовать функцию array_column, которая возвращает массив значений по ключу.</p>
6 <p>А что если мы захотим извлечь возраст? Повторяем:</p>
6 <p>А что если мы захотим извлечь возраст? Повторяем:</p>
7 <p>В примерах выше легко увидеть закономерность. Программа выполняет один и тот же проход по циклу и собирает результат в переменную $result. Единственное, что меняется - значение, которое мы извлекаем из элементов исходного массива. Именно этот паттерн называется отображением.</p>
7 <p>В примерах выше легко увидеть закономерность. Программа выполняет один и тот же проход по циклу и собирает результат в переменную $result. Единственное, что меняется - значение, которое мы извлекаем из элементов исходного массива. Именно этот паттерн называется отображением.</p>
8 <p>Теперь посмотрим, как выполнить ту же самую операцию с помощью array_map:</p>
8 <p>Теперь посмотрим, как выполнить ту же самую операцию с помощью array_map:</p>
9 <p>Функция array_map принимает два параметра:</p>
9 <p>Функция array_map принимает два параметра:</p>
10 <ul><li>Колбэк-функцию</li>
10 <ul><li>Колбэк-функцию</li>
11 <li>Коллекцию, которая будет отображаться</li>
11 <li>Коллекцию, которая будет отображаться</li>
12 </ul><p>Дальше внутри себя array_map делает перебор элементов переданной коллекции и для каждого элемента вызывает колбэк-функцию. На вход этой функции передается элемент исходного массива, а ее результат записывается в новый массив, который и возвращается наружу.</p>
12 </ul><p>Дальше внутри себя array_map делает перебор элементов переданной коллекции и для каждого элемента вызывает колбэк-функцию. На вход этой функции передается элемент исходного массива, а ее результат записывается в новый массив, который и возвращается наружу.</p>
13 <p>Проговорим несколько неочевидных моментов, связанных с array_map и операцией отображения:</p>
13 <p>Проговорим несколько неочевидных моментов, связанных с array_map и операцией отображения:</p>
14 <ul><li>Возвращаемый массив<strong>всегда</strong>такого же размера, как и исходный, потому что array_map отображает каждый элемент исходного массива в элемент возвращаемого</li>
14 <ul><li>Возвращаемый массив<strong>всегда</strong>такого же размера, как и исходный, потому что array_map отображает каждый элемент исходного массива в элемент возвращаемого</li>
15 <li>Внутри анонимной функции можно выполнять любые вычисления, а не только возвращать часть исходного элемента</li>
15 <li>Внутри анонимной функции можно выполнять любые вычисления, а не только возвращать часть исходного элемента</li>
16 <li>Функция array_map полностью скрывает от нас наличие обхода и процесс сборки нового массива</li>
16 <li>Функция array_map полностью скрывает от нас наличие обхода и процесс сборки нового массива</li>
17 </ul><p>Рассмотрим типичный пример, который любят приводить в документации функции map в разных языках программирования. Это применение некоторой арифметической операции к каждому элементу коллекции:</p>
17 </ul><p>Рассмотрим типичный пример, который любят приводить в документации функции map в разных языках программирования. Это применение некоторой арифметической операции к каждому элементу коллекции:</p>
18 <p>Пример выглядит искусственно, но хорошо отражает суть операции.</p>
18 <p>Пример выглядит искусственно, но хорошо отражает суть операции.</p>
19 <p>А теперь рассмотрим реализацию:</p>
19 <p>А теперь рассмотрим реализацию:</p>
20 <p>Перейдем к главному отличию myMap от ручного обхода массива. Дело в том, что функция myMap не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает первым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Функция myMap не знает, чем будет этот результат - ей этого знать не нужно. Ответственность за обработку лежит на пользователях.</p>
20 <p>Перейдем к главному отличию myMap от ручного обхода массива. Дело в том, что функция myMap не знает, что нужно сделать с каждым элементом массива. Поэтому она принимает первым аргументом функцию, которую вызывает для каждого элемента исходного массива, а результат вызова записывается в выходной массив. Функция myMap не знает, чем будет этот результат - ей этого знать не нужно. Ответственность за обработку лежит на пользователях.</p>