The argument unpacking operator ...$var (hereafter referred to as the “splat” operator) currently permits unpacking arrays into an argument list when variadic functions are called, as well as collecting variadic arguments into an array in the callee. However, there are other cases where it can make sense to use a similar construct for brevity and readability. This RFC covers one of these cases which is commonly available in other languages that support a similar operator. This feature is already supported by ECMAScript 6.

A common operation is to merge an existing array stored in a variable with another array that is being declared literally. Currently this is usually done using array_merge() or the + operator:

$arr1 = [ 'd' => 4 , 'e' => 5 , 'f' => 6 ] ; $arr2 = array_merge ( [ 'a' => 1 , 'b' => 2 , 'c' => 3 ] , $arr1 ) ; $arr3 = [ 'a' => 1 , 'b' => 2 , 'c' => 3 ] + $arr1 ;

array_merge() is quite verbose and carries the overheads of invoking a function. The + operator is not always suitable for such an operation and has a cognitive overhead when reading the code, because of the differences in behaviour from array_merge() and may be confusing because you don't always know if you are dealing with arrays or numbers.

This RFC proposes allowing the splat operator to be used in array literals as another way to perform this operation:

$arr1 = [ 'd' => 4 , 'e' => 5 , 'f' => 6 ] ; $arr2 = [ 'a' => 1 , 'b' => 2 , 'c' => 3 , ... $arr1 ] ;

The new syntax gives equivalent behaviour to the array_merge() example above, where the contents of $arr1 are appended to the array literal, and stored in $arr2 . The same rules for merging are followed; in the case of duplicated string keys, the later value overwrites the earlier when read from left to right, and numerically indexed arrays are appropriately re-keyed and appended. Any number of variables can be unpacked at any position in the array literal, and may be combined with regular element declarations in any order.

As such, the following application of array_merge() and of the splat operator and should be equivalent:

A mixture of applying the splat operator to previously assigned variables and other literal should work just as fine:

The operator should have the same behaviour for numeric and associative arrays. Multidimensional arrays should not be flattened: the splat operator should have effect in the first level keys only.