2011-07-02 87 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

這也許應該是接受的答案。 –

相關問題