2011-07-02 89 views
5

的分配我尝试这样不影响:如何第一非虚假变量来自于一组

$a = false; 
$b = false; 
$c = 'sometext'; 
$result = $a or $b or $c or exit('error: all variables are false'); 

和$结果应设置为$ C,但是这给的bool(false)值来代替。

回答

1

有几件事情会在这里:

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

第二,更巧妙的是,“英语”布尔操作符(orand)具有低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" 
} 
4
($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"); 
+0

所以我看有没有更好的方式... $ what_if_my_variable_is_very_very_long_and_descriptive_which_is_good_programming_practice – rsk82

2

布尔运算符的结果在php中是boolean。

$a = false; 
$b = false; 
$c = 'sometext'; 
$result = null; 

foreach(array('a', 'b', 'c') as $k) 
{ 
    if($$k !== false) 
    { 
     $result = $$k; 
     break; 
    } 
} 

另外,考虑将您的变量移动到数组中。

6

什么:

$result = $a ?: $b ?: $c ?: exit('doh!'); 
+0

这也许应该是接受的答案。 –

相关问题