PHP 7.4 Expansión dentro de arreglos (Unpacking inside arrays)

Spread the love

En versiones anteriores de PHP es posible expandir un arreglo como parte de los argumentos de una función.

function sumar($a, $b, $c) {
    return $a + $b + $c;
}

$operadores = [2, 3];
echo sumar(1, ...$operadores);

Esto se logra haciendo uso del operador (…).

Y ahora en PHP 7.4 es posible usar este mismo operador para expandir o desempacar arreglos (Unpacking inside arrays) dentro de otros arreglos.

Esto nos permite hacer algunas cosas interesante que vamos a ver a continuación.

Que puedes hacer al expandir arreglos

Lo mas obvio es que podemos desempacar tantos arreglos como se requiera dentro de otro.

$array1 = [3,4, 5];
$array2 = [6,7,8];
$array3 = [1,2, ...$array1, $array2, 9, 10];

Este ejemplo crea el siguiente arreglo.

array:10 [
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
  5 => 6
  6 => 7
  7 => 8
  8 => 9
  9 => 10
]

Expandir arreglos como retorno de una función o de generadores

Y aquí es donde se comienza a poner interesante, es posible desempacar arreglos como retorno de funciones o métodos.

Así que puedes hacer lo siguiente sin problemas.

function unpack_array() {
    return [11,12];
}

$array1 = [3,4, 5];
$array2 = [6,7,8];
$array3 = [1,2, ...$array1, ...$array2, 9, 10, ...unpack_array()];

Esto genera el siguiente arreglo:

array:12 [
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
  5 => 6
  6 => 7
  7 => 8
  8 => 9
  9 => 10
  10 => 11
  11 => 12
]

Y no hemos acabado también puedes desempacar generadores como arreglos!

El siguiente ejemplo te dejara mas clara la idea.

function array_generator() {
    for ($i = 11; $i <= 12; $i++) {
      yield $i;
    }
}

$array1 = [3,4, 5];
$array2 = [6,7,8];
$array3 = [1,2, ...$array1, ...$array2, 9, 10, ...array_generator()];

Lo cual produce el arreglo de forma correcta

array:12 [
  0 => 1
  1 => 2
  2 => 3
  3 => 4
  4 => 5
  5 => 6
  6 => 7
  7 => 8
  8 => 9
  9 => 10
  10 => 11
  11 => 12
]

Y sí, también el operador se lleva bien con las colecciones de Laravel, así que es posible usarlas.

$users = factory(User::class)->times(5)->create();

$array4 = [...$users->map->name];

En el ejemplo usamos map para obtener solamente los nombres de los usuarios y luego expandir la colección dentro del arreglo.

Esto produce el siguiente resultado.

array:5 [
  0 => "Evie Bailey I"
  1 => "Prof. Leslie Zieme DVM"
  2 => "Lucinda Breitenberg"
  3 => "Mr. Mackenzie Schultz V"
  4 => "Dr. Brielle Schuster"
]

Lo que no puedes hacer con la expansión de arreglos

Como en todas las cosas siempre existe un pero.

Arreglos con indices no numéricos

Lamentablemente no es posible expandir arreglos que usan llaves de tipo string, por ejemplo este intento falla.

$array_keys = ['uno' => 1, 'dos' => 2];
$array = [...$array_keys];

Con el siguiente error:

Error: Cannot unpack array with string keys

No es posible usar referencias

Y finalmente tampoco podemos hacer referencias en conjunto con el operador (…)

Así que esto también falla con un error de sintaxis.

$array4 = [...&$array1]; //Parse error: syntax error, unexpected '&' in ...

Conclusión

Con esto creo que cubrimos los puntos importantes de esta nueva característica de PHP 7.4 y te da una buena idea de todo lo que puedes hacer con ella.

Puedes descargar esta versión de PHP desde el sitio oficial y comenzar a probar estas novedades y las que veamos en futuras entradas.

Para finalizar comparte este articulo o deja tu comentario!.