La sintaxis del doble signo de interrogación en PHP

$foo = $bar ?? null;

Devolverá nulo si $ bar no está definido. Esta sintaxis es extremadamente útil para simplificar el código y evitar declaraciones if masivas.

Ahora tengo la siguiente situación

if (!isset($bar2)) {
    $fooArr = [$bar1];
} else {
    $fooArr = [$bar1, $bar2];
}

Parece muy probable que exista una simplificación de una línea para la declaración, pero no pude encontrarla.

Lo más cercano que se me ocurre es lo siguiente, pero creará una matriz con tamaño 2 donde el segundo elemento es nulo, que no es lo que quiero.

$fooArr = [$bar1, $bar2 ?? null];

¿Hay alguna manera de simplificar el anidado mencionado anteriormente sin usar la declaración if?

Editar: la sintaxis ? : funciona para el caso anterior, pero todavía tendré que escribir $bar1 dos veces en esa situación, que no es mucho más ordenada que la declaración if y puede crecer mucho cuando la matriz consiste de 5 elementos.

1
cr001 26 nov. 2021 a las 13:55
$bar1 && $a = 3; Creo que eso servirá para definir la variable. Pero en tu caso, creo que es $fooArr = $bar1 ? [$bar1, $bar2] : [$bar1 ]
 – 
Rajesh Paudel
26 nov. 2021 a las 14:00
1
 – 
gre_gor
26 nov. 2021 a las 14:00
Eso funciona, pero tendré que escribir $ bar1 dos veces como $bar2 ? [$bar1, $bar2] : [$bar1]. Esto puede llegar a ser muy largo cuando la matriz consta de, digamos, 5 elementos y el último elemento es el que quiero ramificar. Me pregunto si hay una manera sin la necesidad de escribir cada elemento de la matriz dos veces.
 – 
cr001
26 nov. 2021 a las 14:07

1 respuesta

La mejor respuesta

El método array_filter() solo devuelve el valores vacíos de una matriz de forma predeterminada.

Este código muestra los diversos resultados:

$bar1=1;
$fooArr = [$bar1, $bar2 ?? null];
print_r($fooArr);

$bar2=2;
$fooArr = [$bar1, $bar2 ?? null];
print_r($fooArr);

unset($bar1,$bar2);

$bar1=1;
$fooArr = array_filter([$bar1, $bar2 ?? null]);
print_r($fooArr);

$bar2=2;
$fooArr = array_filter([$bar1, $bar2 ?? null]);
print_r($fooArr);

El patio de recreo

1
JMP 26 nov. 2021 a las 14:20
Gracias. ¡Esto se ve muy bien!
 – 
cr001
26 nov. 2021 a las 14:22