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






Я нашел решение.
Это можно сделать, используя функцию 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';
}
Мне нравится верхнее, более абстрактное решение.
Почему бы не передать массив в функцию и не слиться с ней?