2

可能重複:
Problem with PHP ternary operator如何理解PHP中嵌套的?:運算符?

我在PHP讀了一下在this article,我停了一段時間來考慮他的抱怨之一。我無法弄清楚PHP到底是如何實現的。

與其他語言不同(字面意義上的)帶有類似的運算符,?:是左邊關聯。所以這個:

$arg = 'T'; 
$vehicle = (($arg == 'B') ? 'bus' : 
      ($arg == 'A') ? 'airplane' : 
      ($arg == 'T') ? 'train' : 
      ($arg == 'C') ? 'car' : 
      ($arg == 'H') ? 'horse' : 
      'feet'); 
echo $vehicle; 

打印馬。

PHP遵循什麼邏輯路徑導致'horse'被分配到$vehicle

+0

http://php.net/manual/en/language.operators.comparison.php三元運算符實施例#3 –

+1

三元運算是巨大的,但在PHP中,我強烈建議您對它們應用大量的括號以明確您的期望行爲。 – Jazz

回答

0

,包圍兩種理解固定的解決方案:

這應該有意外結果(horse):

$arg = 'T'; 
$vehicle = (
    (
     (
      (
       (
        ($arg == 'B') ? 'bus' : ($arg == 'A') 
       ) ? 'airplane' : ($arg == 'T') 
      ) ? 'train' : ($arg == 'C') 
     ) ? 'car' : ($arg == 'H') 
    ) ? 'horse' : 'feet' 
); 
echo $vehicle; 

這應具有indended結果(train):

$arg = 'T'; 
$vehicle = (
    ($arg == 'B') ? 'bus' : (
     ($arg == 'A') ? 'airplane' : (
      ($arg == 'T') ? 'train' : (
       ($arg == 'C') ? 'car' : (
        ($arg == 'H') ? 'horse' : 'feet' 
       ) 
      ) 
     ) 
    ) 
); 
echo $vehicle; 
2

注:

建議您避免 「堆積」 三元表達式。在一個語句中使用多個三元運算符時,PHP的行爲並不明顯:

<?php 
// on first glance, the following appears to output 'true' 
echo (true?'true':false?'t':'f'); 

// however, the actual output of the above is 't' 
// this is because ternary expressions are evaluated from left to right 

// the following is a more obvious version of the same code as above 
echo ((true ? 'true' : false) ? 't' : 'f'); 

// here, you can see that the first expression is evaluated to 'true', which 
// in turn evaluates to (bool)true, thus returning the true branch of the 
// second ternary expression. 
?> 

http://php.net/manual/en/language.operators.comparison.php#language.operators.comparison.ternary