PHP назначает первое не-нулевое значение

У меня есть три значения:

$a = null
$b = 3;
$c = null

(Я никогда не знаю, что будет null: возможно, все они, возможно, ни один из них.)

После так называемой ленивой загрузки я попытался присвоить первое значение, отличное от нуля:

$d = $a or $b or $c;

(Это похоже на способ JavaScript var d = a || b; (он назначит b, если нет a).)

Но в PHP это, похоже, не работает.

Я делаю это неправильно, или что это лучший и самый простой способ сделать это?

Ответ 1

Вы можете использовать короткий тернарный оператор в PHP 5. 3+:

$d = $a ?: $b ?: $c;

Обратите внимание, что это делает тип принуждения, как в JS.


Обновление (PHP 7)

В PHP 7. 0+ вы бы сделали (называемый null coalescing - больше информации):

$d = $a ?? $b ?? $c;

Ответ 2

Попробуй это...

$d = array_filter(array($a, $b, $c))[0]; //newer PHP only

или это:

$d = current(array_filter(array($a, $b, $c))); //warning about references

или это:

$tmp = array_filter(array($a, $b, $c));
$d = current($tmp); //most safe

Ответ 3

В PHP 7 вы можете использовать оператор "Null coalescing":

$d = $a ?? $b ?? $c;

Это задает первое ненулевое значение (или null, если оно отсутствует), как заданный вопрос.

В отличие от некоторых других ответов, он не будет сбиваться с помощью неявного литья типов, например,

$b = 0; $c = 1;
$d = $a ?? $b ?? $c;
echo $d;

выведет 0: он не будет возражать, что $ a не был установлен вообще и не будет проходить через $ b, даже если он набирает тип - false.

Ответ 4

Если вы можете поместить переменные в массив, это может помочь:

$d = current(array_filter(array($a, $b, $c)));

или это может быть и apporach:

if(!empty($a)) {
 $d = $a;

} 

эта проверка может иметь значение для всех переменных, таких как $b и $c

Ответ 5

в php вы можете сделать это следующим образом:

'<?php
 $a = 1;
 $b = null;
 $c = null;
 $d = $a ? $a:($b?$b:($c?$c:'null'));
echo $d;
?>'

Ответ 6

Вы можете попробовать:

$d = !is_null($a) ? $a : (!is_null($b) ? $b : $c);