我有三个这样的值:
$a = null
$b = 3;
$c = null
(我永远不会知道null
会是什么:也许是所有这些,也许都不是。)
在所谓的延迟加载之后,我试图以这种方式分配第一个非空值:
$d = $a or $b or $c;
(类似于JavaScript方式var d = a || b;
(如果没有,则会指定b)。)
但是在PHP中它似乎不起作用。
我做错了,或者最简单的方法是什么?
答案 0 :(得分:37)
您可以在PHP 5.3 +中使用短三元运算符:
$d = $a ?: $b ?: $c;
请注意,这确实类似于JS中的强制类型。
更新(PHP 7)
在PHP 7.0+中你会这样做(称为null coalescing
- more informations):
$d = $a ?? $b ?? $c;
答案 1 :(得分:3)
试试这个......
$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
答案 2 :(得分:2)
在PHP 7中,您可以使用“Null coalescing”运算符:
$d = $a ?? $b ?? $c;
这将分配第一个非空值(如果没有,则为null),如问题所示。
与其他一些答案不同,它不会被隐式类型转换绊倒,例如,
$b = 0; $c = 1;
$d = $a ?? $b ?? $c;
echo $d;
将输出0:它不会介意$ a根本没有设置,即使它输出到false
也不会超过$ b。
答案 3 :(得分:1)
如果您可以将变量放在数组中,这可以提供帮助:
$d = current(array_filter(array($a, $b, $c)));
或者这也可以是一个apporach:
if(!empty($a)) {
$d = $a;
}
此检查可能会包含所有变量,例如$b
和$c
答案 4 :(得分:1)
`<?php
$a = 1;
$b = null;
$c = null;
$d = $a ? $a:($b?$b:($c?$c:'null'));
echo $d;
?>`
答案 5 :(得分:0)
您可以尝试:
$d = !is_null($a) ? $a : (!is_null($b) ? $b : $c);