如何从一组中分配第一个非假变量

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)

  • 这应该是公认的答案. (4认同)

Joh*_*ter 2

这里发生了一些事情:

首先,在 PHP 中,布尔运算的结果是布尔值。

其次,更微妙的是,“英语”布尔运算符 (orand) 的优先级较低- 低于赋值运算符=

因此,在此表达式$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)