Синтаксис PHP Spread в декларации массива

PHP поддерживает синтаксис распространения для переменных функций.

В JavaScript вы можете использовать синтаксис распространения, чтобы сделать это:

var a = [1, 2];
var b = [...a, 3, 4];
console.log(b); // [1, 2, 3, 4]

Тем не менее, пытаясь сделать это в PHP:

$a = [1, 2];
$b = [...$a, 3, 4];
var_dump($b);die;

Результаты этой ошибки:

Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']'

Разве использование синтаксиса распространения таким способом не разрешено в PHP? Если да, то есть ли такой же элегантный способ добиться того же эффекта?

Ответ 1

Оператор распространения в массивах RFC был реализован в PHP 7.4:

$ary = [3, 4, 5];
return [1, 2, ...$ary]; // same as [1, 2, 3, 4, 5]

Предостережение: распакованный массив /Traversable может иметь только целочисленные ключи. Для строковых ключей array_merge() все еще требуется.

Ответ 2

Обновление: оператор распространения в выражении массива

Источник: https://wiki.php.net/rfc/spread_operator_for_array

Version: 0.2
Date: 2018-10-13
Author: CHU Zhaowei, [email protected]
Status: Implemented (in PHP 7.4)

Пара массивов с префиксом будет расширена местами во время определения массива. Развертывать можно только массивы и объекты, которые реализуют Traversable.

Например:

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];

Возможно выполнить расширение несколько раз, и, в отличие от распаковки аргументов,… может использоваться где угодно. Можно добавить нормальные элементы до или после оператора распространения.

Оператор распространения работает как с синтаксисом массива (array()), так и с коротким синтаксисом ([]).

Также можно сразу распаковать массив, возвращенный функцией.

$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']

$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']

function arrGen() {
    for($i = 11; $i < 15; $i++) {
        yield $i;
    }
}
$arr8 = [...arrGen()]; //[11, 12, 13, 14]

& lt; ---------------End из Update----------------→

Прежде всего, вы ссылаетесь на функцию Variadic с массивами в неправильном смысле.

Вы можете создать свой собственный метод для этого или лучше использовать array_merge, как предложено @Mark Baker в комментарии к вашему вопросу.

Если вы все еще хотите использовать оператор распространения /..., вы можете реализовать нечто подобное самостоятельно.

<?php
function merge($a, ...$b) {
    return array_merge($a,$b);
}

$a = [1, 2];
$b = [3,4];
print_r( merge($a, ...$b));
?>

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

Более разумный пример:

<?php
$a = [1,2,3,56,564];
$result = merge($a, 332, 232, 5434, 65);
var_dump($result);
?>

Ответ 3

В PHP 7.4 теперь вы можете использовать операторы распространения в выражениях массива.

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];