Сигнатура функции array_merge
в документации определяется так:
array_merge ([ array $... ] ) : array
Она говорит нам о том, что в array_merge
можно передать любое количество массивов:
<?php
array_merge([1]);
# Array
# (
# [0] => 1
# )
array_merge([1], [1]);
# Array
# (
# [0] => 1
# [1] => 1
# )
array_merge([1], [1], [3, 4]);
# Array
# (
# [0] => 1
# [1] => 1
# [2] => 3
# [3] => 4
# )
array_merge([1], [1], [3, 4], []);
# Array
# (
# [0] => 1
# [1] => 1
# [2] => 3
# [3] => 4
# )
С точки зрения вызова - ничего необычного, просто разное число аргументов. А вот определение функции с переменным числом аргументов выглядит необычно и использует незнакомый для нас синтаксис:
<?php
function sum(...$numbers)
{
return array_sum($numbers);
}
echo sum(9, 4); // => 13
echo sum(-3, 0, 3, 1); // => 1
Три точки представляют собой Spread Operator. Основная сложность для понимания состоит в том, что Spread Operator выполняет различные действия в зависимости от того, где он применяется. В определении функции он выполняет "упаковку" параметров, а при вызове - наоборот, "распаковку". Про упаковку параметров будем говорить в этом уроке. В следующем же уроке рассмотрим Spread Operator в роли распаковщика.
Итак, назначение Spread Operator в определении функции состоит в том, чтобы собрать в массив все переданные аргументы. Если в функцию не передаётся ни одного аргумента, то массив будет пустым.
<?php
echo sum(); // => 0
Обратите внимание на то, что этому оператору не важен тип аргументов, они все станут элементами массива, даже если мы передаём на вход функции массивы.
<?php
function show(...$arguments)
{
print_r($arguments);
}
show([]);
# Array
# (
# [0] => Array
# (
# )
#
# )
show([1, 3], [], 3);
# Array
# (
# [0] => Array
# (
# [0] => 1
# [1] => 3
# )
#
# [1] => Array
# (
# )
#
# [2] => 3
# )
Теперь взглянем на сигнатуру array_merge
ещё раз:
array_merge(array ...$arrays): array
Видно, что функция array_merge
ждёт на вход как минимум один массив, опциональны только следующие. Такого поведения можно добиться следующим кодом:
<?php
function sum($a, ...$numbers)
{
return $a + array_sum($numbers);
}
echo sum();
// PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function sum(), 0 passed
echo sum(10); // => 10
echo sum(10, 4); // => 14
echo sum(8, 10, 4); // => 22
То же можно сделать и для двух аргументов:
<?php
function sum($a, $b, ...$numbers)
{
# ...
}
Эту идею можно продолжать и дальше, делая обязательными то количество аргументов, которое требуется. Единственное ограничение: Spread Operator может быть использован только для последнего аргумента. То есть такой код синтаксически не верен:
<?php
function sum(...$numbers, $a)
{
# ...
}
И такой тоже:
<?php
function sum($a, ...$numbers, $a)
{
# ...
}

Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
- Статья «Как учиться и справляться с негативными мыслями»
- Статья «Ловушки обучения»
- Статья «Сложные простые задачи по программированию»
- Урок «Как эффективно учиться на Хекслете»
- Вебинар «Как самостоятельно учиться»
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.