Синтаксис двойного вопросительного знака в PHP

$foo = $bar ?? null;

Вернет null, если $ bar не определено. Этот синтаксис чрезвычайно полезен для упрощения кода и предотвращения массивных операторов if.

Теперь у меня такая ситуация

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

Кажется настолько вероятным, что существует однострочное упрощение для утверждения, но я просто не мог его придумать.

Ближайшее, что я придумал, это следующее, но оно создаст массив размером 2, в котором второй элемент равен нулю, а это не то, что я хочу.

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

Есть ли способ упростить вышеупомянутый вложенный if без использования оператора if?

Изменить: синтаксис ? : работает для приведенного выше случая, но мне все равно придется дважды записать $bar1 в этой ситуации, что не намного лучше, чем оператор if, и может стать очень большим, когда массив состоит из 5 элементов.

1
cr001 26 Ноя 2021 в 13:55
$bar1 && $a = 3; Я думаю, что это достаточно для определения переменной. Но в вашем случае я думаю, что это $fooArr = $bar1 ? [$bar1, $bar2] : [$bar1 ]
 – 
Rajesh Paudel
26 Ноя 2021 в 14:00
1
 – 
gre_gor
26 Ноя 2021 в 14:00
Это работает, но мне нужно будет дважды написать $ bar1, как $bar2 ? [$bar1, $bar2] : [$bar1]. Это может стать очень длинным, когда массив состоит, скажем, из 5 элементов, а последний элемент - это то, на чем я хочу перейти. Интересно, есть ли способ обойтись без необходимости дважды записывать каждый элемент массива.
 – 
cr001
26 Ноя 2021 в 14:07

1 ответ

Лучший ответ

Метод array_filter() возвращает только не- по умолчанию пустые значения из массива.

Этот код показывает различные результаты:

$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);

Детская площадка

1
JMP 26 Ноя 2021 в 14:20
Спасибо. Выглядит неплохо!
 – 
cr001
26 Ноя 2021 в 14:22