Диспетчеризация по ключу ассоциативного массива мощнее чем кажется на первый взгляд. Далеко не всегда достаточно выбирать разные данные, иногда приходится выполнять другой код.
Предположим что нам надо сформировать массив с фамилиями наших пользователей. Главное условие – для девушек берётся девичья фамилия.
Реализуем эту задачу, используя старый добрый if
:
<?php
$lastNames = array_map(function ($user) {
if ($user->gender === 'female') {
return $user->maidenName;
}
return $user->lastName;
}, $users);
Теперь решим эту задачу с помощью диспетчеризации по ключам объекта, но в отличие от предыдущего урока, в значениях у нас будут функции:
<?php
// Определяем key-value, где ключ это пол, а значение это функция, возвращающая нужное значение для пола
$mapping = [
'female' =>
fn($user) => $user->maidenName,
'male' =>
fn($user) => $user->lastName,
];
// Выбираем нужную функцию по названию пола и вызываем её
// Внутрь функции передается пользователь
$lastNames = array_map(fn($user) => $mapping[$user->gender]($user), $users);
Кода стало немного больше, но хочу подчеркнуть, что во многом "виноват" сам PHP. У него очень многословный синтаксис определения анонимных функций. Тот же код в JavaScript, будет практически идентичен по размерам первоначальному варианту.
В некоторых ситуациях такой вариант решения задачи лучше. В нём явно прослеживаются зависимости, особенно если их становится много. Кроме того, конфигурация данными позволяет вынести их в другое место и расширять поведение без переписывания кода, который использует эти данные.
Ещё один пример – парсинг данных в зависимости от их типа:
<?php
use Symfony\Component\Yaml\Yaml;
function parse($type, $data)
{
$mapping = [
'yml' =>
fn($rawData) => Yaml::parse($rawData),
'json' =>
fn($rawData) => json_decode($rawData),
];
return $mapping[$type]($data);
}
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.