rsk*_*k82 6 php operator-precedence
我试过这种方式没有效果:
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
Run Code Online (Sandbox Code Playgroud)
并且$ result应设置为$ c,但这会给出bool(false)相反的值.
Mat*_*att 11
关于什么:
$result = $a ?: $b ?: $c ?: exit('doh!');
Run Code Online (Sandbox Code Playgroud)
这里发生了一些事情:
首先,在 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
Run Code Online (Sandbox Code Playgroud)
这很令人困惑,而且几乎肯定不是您想要的。
要获取, $a,中的任何一个是否为真(即或可转换为)的布尔结果,您可以使用括号强制优先级,或使用具有更高优先级的“C 风格”运算符(和):$b$ctruetrue||&&
// 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;
Run Code Online (Sandbox Code Playgroud)
如果您不确定运算符的优先级,最好使用括号 - 它们也有助于使代码更具可读性,因为计算顺序更加明显。
通常最好不要依赖隐式类型转换(尤其是转换非数字字符串),因为它往往会导致代码不清楚。
编辑:
要回答实际问题,另一种方法(尽管在这种情况下我并不真正推荐它,因为你说你只对第一个非假值感兴趣)是不使用array_filter回调 - 这将返回一个数组输入数组中所有真实值的集合,并保留键。
例如:
$a = false;
$b = false;
$c = 'sometext';
$result = array_filter(array($a, $b, $c));
var_dump($result);
Run Code Online (Sandbox Code Playgroud)
输出:
array(1) {
[2]=>
string(8) "sometext"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
799 次 |
| 最近记录: |