22

我有一些像这样的三个值:

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

(我永远不知道会是什么null:也许全部,也许没有。)

在所谓的延迟加载之后,我尝试以这种方式分配第一个非空值:

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

(类似于 JavaScript 方式var d = a || b;(如果没有 a 则分配 b)。)

但在 PHP 中它似乎不起作用。

我做错了吗,或者什么是最好和最简单的方法?

4

6 回答 6

47

您可以在 PHP 5.3+ 中使用短三元运算符:

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

请注意,这确实像在 JS 中一样类型强制。


更新(PHP 7)

在 PHP 7.0+ 中,您会这样做(称为null coalescing-更多信息):

$d = $a ?? $b ?? $c;
于 2013-07-05T07:15:04.903 回答
4

试试这个...

$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
于 2013-07-05T07:15:58.613 回答
3

在 PHP 7 中,您可以使用“Null coalescing”运算符:

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

正如问题所要求的那样,这将分配第一个非空值(如果没有,则为空值)。

与其他一些答案不同,它不会被隐式类型转换绊倒,例如,

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

将输出 0:它不会介意 $a 根本没有被设置并且不会超过 $b 即使它类型转换为false.

于 2016-05-09T11:21:42.063 回答
1

如果您可以将变量放入数组中,这会有所帮助:

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

或者这也可以是一个方法:

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

} 

此检查可能会针对所有变量继续进行,例如$b$c

于 2013-07-05T07:14:38.263 回答
1

在php中你可以这样做: -

`<?php
 $a = 1;
 $b = null;
 $c = null;
 $d = $a ? $a:($b?$b:($c?$c:'null'));
echo $d;
?>`
于 2013-07-05T07:18:14.290 回答
0

您可以尝试:

$d = !is_null($a) ? $a : (!is_null($b) ? $b : $c);
于 2013-07-05T07:16:01.597 回答