Функция PHP, вызываемая как элемент массива, заменяется возвращаемым значением функции

Впервые я увидел такое поведение в Laravel в документации для Ресурсы API, где описан функционал $this->mergeWhen().

На самом деле я хочу вызвать функцию как элемент в массиве и установить ее возвращаемое значение как пару ключ => значение в массиве, в котором она вызывается. Довольно простой, на самом деле это код, он не требует пояснений.

$data = ['name' => 'John', getSurname()];
print_r($data);


function getSurname()
{
    return ['surname' => 'Doe'];
}

Это нормально работает, но возвращаемое значение выглядит так:

Array
(
    [name] => John
    [0] => Array
        (
            [surname] => Doe
        )

)

Я бы хотел, чтобы результат выглядел так:

Array
(
    [name] => John
    [surname] => Doe
)

Почему бы не передать массив в функцию и не слиться с ней?

Simone Rossaini 30.03.2021 16:22

Поскольку исходный массив может быть большим массивом, и я хочу условно добавить столбец (например, промежуточное имя), только если столбец существует где-то еще. Чтобы избежать передачи всего массива функции, которая будет условно добавлять только один элемент, я применил подход, рекомендованный ниже.

Ivica Pesovski 30.03.2021 16:37
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
23
1

Ответы 1

Я нашел решение.

Это можно сделать, используя функцию PHP array_merge для объединения существующего и возвращенного массивов, например:

$data = array_merge(['name' => 'John'], getSurname());

Почему это круто? Потому что функция getSurname () может иметь внутри тяжелую логику. Например, он может вернуть результат как ['surname' => 'Doe'] или как ['middlename' => 'Mike', 'surname' => 'Doe'] в зависимости от того, какие данные у нас есть для клиента. Наш массив будет работать динамически. Мы абстрагируем логику функции getSurname, которая также может быть методом класса.

Напротив, если не использовать этот способ, единственное другое решение, которое я могу представить для данного сценария, это следующее:

$data = ['name' => 'John'];
if (//code checking if the user has surname) {
    $data['surname'] = 'Doe';
}
if (//code checking if the user has middlename) {
     $data['middlename'] = 'Mike';
}

Мне нравится верхнее, более абстрактное решение.

Другие вопросы по теме