我尝试了这种方法,但没有效果:
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
$result应该设置为$c,但这会给出bool(false)
的值。
关于:
$result = $a ?: $b ?: $c ?: exit('doh!');
($result = $a) || ($result = $b) || ($result = $c) || exit("no");
或者,如果您想要0和空字符串等,则不算作错误:
(($result = $a) !== false) || (($result = $b) !== false) || (($result = $c) !== false) || exit("no");
想想这是否真的可读。你也可以使用老式的方式:
if ($a !== false)
$result = $a;
elseif ($b !== false)
$result = $b;
elseif ($c !== false)
$result = $c;
else
exit("no");
编辑:以防万一你需要一些动态的东西;-(。
foreach(array('a','b','c') as $key)
if (($result = $$key) !== false)
break;
if ($result === false)
exit("no");
这里有两件事:
首先,在PHP中,布尔运算的结果是布尔值。
其次,更微妙的是,"英语"布尔运算符(or
和and
(的优先级较低,低于赋值运算符=
。
因此,在此表达式中,$result
将始终获得$a的实际值(与$a
的值无关(,因为赋值应用于布尔运算符之前。
// This has the same effect:
$result = $a or $b or $c;
// As this:
$result = $a;
$a or $b or $c; // this has no effect
这是令人困惑的,几乎可以肯定不是你想要的。
要获得$a
、$b
、$c
中任何一个是否为真(即true
或可转换为true
(的布尔结果,可以使用括号强制设置优先级,也可以使用优先级较高的"C样式"运算符(||
和&&
(:
// These all have the same effect:
$result = ($a or $b or $c);
$result = $a || $b || $c;
if ($a or $b or $c)
$result = true;
else
$result = false;
if ($a || $b || $c)
$result = true;
else
$result = false;
如果你不确定运算符的优先级,最好使用括号——它们也有助于提高代码的可读性,因为求值的顺序变得更加明显。
通常情况下,最好不要依赖隐式类型转换(尤其是强制转换非数字字符串(,因为这往往会导致代码不清楚。
编辑:
为了回答实际的问题,另一种方法(尽管在这种情况下我并不建议这样做,因为你说你只对第一个非false值感兴趣(是在没有回调的情况下使用array_filter
——这将返回一个所有输入数组中的值的数组,这些值是truthy的,并保留键。
例如:
$a = false;
$b = false;
$c = 'sometext';
$result = array_filter(array($a, $b, $c));
var_dump($result);
输出:
array(1) {
[2]=>
string(8) "sometext"
}
布尔运算符的结果在php中是布尔的。
$a = false;
$b = false;
$c = 'sometext';
$result = null;
foreach(array('a', 'b', 'c') as $k)
{
if($$k !== false)
{
$result = $$k;
break;
}
}
另外,考虑将变量移动到数组中。