的分配我尝试这样不影响:如何第一非虚假变量来自于一组
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
和$结果应设置为$ C,但是这给的bool(false)
值来代替。
的分配我尝试这样不影响:如何第一非虚假变量来自于一组
$a = false;
$b = false;
$c = 'sometext';
$result = $a or $b or $c or exit('error: all variables are false');
和$结果应设置为$ C,但是这给的bool(false)
值来代替。
有几件事情会在这里:
首先,在PHP中的布尔运算的结果是一个布尔值。
第二,更巧妙的是,“英语”布尔操作符(or
和and
)具有低precedence - 比赋值运算符,=
更低。
因此,在这种表达$result
总是会得到的$一个(无论$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
是truthy(即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;
如果你不确定运算符优先级,最好使用括号 - 他们也往往有助于使代码更易读,因为计算的顺序是由更明显。
不依赖隐式类型转换(尤其是转换非数字字符串)通常也会更好,因为它往往会导致代码不清晰。
编辑:
要回答这个问题实际,另一种方法(虽然我真的不推荐它在这种情况下,既然你说你只在第一个非假值兴趣)将在没有回调的情况下使用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"
}
($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中是boolean。
$a = false;
$b = false;
$c = 'sometext';
$result = null;
foreach(array('a', 'b', 'c') as $k)
{
if($$k !== false)
{
$result = $$k;
break;
}
}
另外,考虑将您的变量移动到数组中。
什么:
$result = $a ?: $b ?: $c ?: exit('doh!');
这也许应该是接受的答案。 –
所以我看有没有更好的方式... $ what_if_my_variable_is_very_very_long_and_descriptive_which_is_good_programming_practice – rsk82