PHP Spread Operator

Summary: in this tutorial, you will learn about the PHP spread operator and how to use it effectively, like merging multiple arrays into a single one.

Introduction to the PHP spread operator

PHP 7.4 introduced the spread operator to the array expression. PHP uses the three dots (...) to denote the spread operator.

When you prefix an array with the spread operator, PHP will spread array elements in place:

...array_varCode language: PHP (php)

For example:

<?php

$numbers = [4,5];
$scores = [1,2,3, ...$numbers];

print_r($scores);Code language: PHP (php)

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)Code language: PHP (php)

How it works.

  • First, define the $numbers array that holds two integers.
  • Second, define the $scores array of three integers 1, 2, and 3. Also, spread elements of the $numbers array into the $scores array. As a result, the $score array will contain five numbers 1, 2, 3, 4, and 5.

The spread operator offers better performance than the array_merge() function because it is a language construct whereas the array_merge() is a function call. Also, PHP optimizes the performance for constant arrays at compile time.

Unlike argument unpacking, you can use the spread operator anywhere. For example, you can use the spread operator at the beginning of the array:

<?php

$numbers = [1,2];
$scores = [...$numbers, 3, 4];

print_r($scores);Code language: PHP (php)

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)Code language: PHP (php)

Or you can use the spread operator in the middle of an array like this:

<?php

$numbers = [2,3];
$scores = [1, ...$numbers, 4];

print_r($scores);Code language: PHP (php)

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
)Code language: PHP (php)

Using PHP spread operator multiple times

PHP allows you to use the spread operator multiple times. For example:

<?php

$even = [2, 4, 6];
$odd = [1, 2, 3];
$all = [...$odd, ...$even];

print_r($all);Code language: PHP (php)

Output:

Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 2
    [4] => 4
    [5] => 6
)Code language: PHP (php)

How it works.

  • First, define two arrays $even and $odd that hold the even and odd numbers.
  • Second, use the spread operator to spread elements of these arrays into a new array $all. The $all array will hold the elements of both arrays, $even and $odd.

Using PHP spread operator with a return value of a function call

The following example uses the spread operator with a return value of a function:

<?php

function get_random_numbers()
{
    for ($i = 0; $i < 5; $i++) {
        $random_numbers[] = rand(1, 100);
    }
    return $random_numbers;
}

$random_numbers = [...get_random_numbers()];

print_r($random_numbers);Code language: PHP (php)

Output:

Array
(
    [0] => 47
    [1] => 78
    [2] => 83
    [3] => 13
    [4] => 32
)Code language: PHP (php)

How it works.

  • First, define a function get_random_numbers() that returns an array of five random integers between 1 and 100.
  • Then, use the spread operator to spread out the elements of the returned array directly from the function call.

Note that you’ll likely see a different output because of the rand() function.

Using PHP spread operator with a generator

In the following example, first, we define a generator that returns even numbers between 2 and 10. Then, we use the spread operator to spread out the returned value of the generator into an array:

<?php

function even_number()
{
    for($i =2; $i < 10; $i+=2){
        yield $i;
    }
}

$even = [...even_number()];

print_r($even);Code language: PHP (php)

Output:

Array
(
    [0] => 2
    [1] => 4
    [2] => 6
    [3] => 8
)Code language: PHP (php)

Using PHP spread operator with a Traversable object

PHP allows you to apply the spread operator not only to an array but also to any object that implements the Traversable interface. For example:

<?php

class RGB implements IteratorAggregate
{
    private $colors = ['red','green','blue'];

    public function getIterator()
    {
        return new ArrayIterator($this->colors);
    }
}

$rgb = new RGB();
$colors = [...$rgb];

print_r($colors);Code language: PHP (php)

Output:

Array
(
    [0] => red
    [1] => green
    [2] => blue
)Code language: PHP (php)

Spread operator and named arguments

PHP 8 allows you to call a function using named arguments. For example:

<?php


function format_name(string $first, string $middle, string $last): string
{
    return $middle ?
        "$first $middle $last" :
        "$first $last";
}

echo format_name(
    first: 'John',
    middle: 'V.',
    last: 'Doe'
); // John V. Doe

Code language: HTML, XML (xml)

Also, you can pass the arguments to the format_name function using the spread operator:

<?php


function format_name(string $first, string $middle, string $last): string
{
    return $middle ?
        "$first $middle $last" :
        "$first $last";
}


$names = [
    'first' => 'John',
    'middle' => 'V.',
    'last' => 'Doe'
];

echo format_name(...$names); // John V. Doe
Code language: HTML, XML (xml)

In this case, the keys of the array elements correspond to parameter names of the format_name() function.

Summary

  • PHP uses the three dots (...) to denote the spread operator.
  • The spread operator spreads out the elements of an array (...array_var).
  • Use the spread operator with an array or an object that implements the Traversable interface.
  • Use the PHP spread array to merge two or more arrays into one.
Did you find this tutorial useful?