PHP: Функции

Отображение (map)

Первая функция из золотой тройки называется 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 не знает, и ей этого знать не нужно. Ответственность за обработку лежит на пользователях.


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».