Php 简明教程

PHP - Spread Operator

PHP 将三个点符号(…​)识别为 spread operator 。展开运算符有时也称为 splat operator 。此运算符最初在 PHP 7.4 版本中引入。它可以在许多情况下有效使用,例如解包数组。

Example 1

在下面的示例中,$arr1 中的元素插入到 $arr2 中其自身元素的列表之后。

<?php
   $arr1 = [4,5];
   $arr2 = [1,2,3, ...$arr1];

   print_r($arr2);
?>

它将生成以下 output

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
)

Example 2

展开运算符可以在表达式中多次使用。例如,在以下代码中,通过扩展两个数组中的元素来创建一个第三个数组。

<?php
   $arr1 = [1,2,3];
   $arr2 = [4,5,6];
   $arr3 = [...$arr1, ...$arr2];

   print_r($arr3);
?>

它将生成以下 output

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
   [5] => 6
)

Example 3

请注意,可以使用 array_merge() 函数获得相同的结果,如下所示:

<?php
   $arr1 = [1,2,3];
   $arr2 = [4,5,6];
   $arr3 = array_merge($arr1, $arr2);

   print_r($arr3);
?>

它将产生相同的 output ——

Array
(
   [0] => 1
   [1] => 2
   [2] => 3
   [3] => 4
   [4] => 5
   [5] => 6
)

但是,使用(…​)运算符的效率要高得多,因为它避免了函数调用的开销。

Example 4

PHP 8.1.0 还引入了另一项功能,允许在解包参数后使用命名参数。不必为每个参数分别提供值,而是将数组中的值解包到相应的参数中,在数组前使用 …​(三个点)。

<?php
   function  myfunction($x, $y, $z=30) {
      echo "x = $x  y = $y  z = $z";
   }

   myfunction(...[10, 20], z:30);
?>

它将生成以下 output

x = 10  y = 20  z = 30

Example 5

在以下示例中,函数的返回值是一个数组。然后数组元素被展开和解包。

<?php
   function get_squares() {
      for ($i = 0; $i < 5; $i++) {
         $arr[] = $i**2;
      }
      return $arr;
   }
   $squares = [...get_squares()];
   print_r($squares);
?>

它将生成以下 output

Array
(
   [0] => 0
   [1] => 1
   [2] => 4
   [3] => 9
   [4] => 16
)