2012-04-16 82 views
0

我在我的代碼有嵌套三元運營商這樣的:PHP嵌套三元問題

$error = $fault_all ? "ALL" : $fault_twothirds ? "TWOTHIRDS" : $fault_onethird ? "ONETHIRD" : "UNKNOWN"; 
     echo 'STATEERROR: ' . $error . ';'; 

他們在我的優先順序列出左到右,所以如果$ fault_all和$ fault_twothirds是真實的,我想將「ALL」分配給$ error;如果所有這些都是真的,那也是一樣。如果全部都是錯誤的,則應將「UNKNOWN」指定爲錯誤。

但是,如果它們中的任何一個爲真,則僅返回「ONETHIRD」,如果全部返回假「UNKNOWN」。我如何使「全部」和「TWOTHIRDS」返回?

+7

嵌套三元運算符是不友好的調試。不要使用它們。切換到if/else/etc。 – Quentin 2012-04-16 11:42:11

+4

PHP與嵌套三元運算符相比,其行爲與其他語言不同。 [看這裏](http://17thdegree.com/archives/2008/01/09/php-and-nesting-ternary-operators/) – 2012-04-16 11:42:41

+2

使用pamentalhesis決定優先 – hjpotter92 2012-04-16 11:45:35

回答

1

就能夠調試和管理狀態列表而言,我建議停止使用不可讀的三元組,並使用開關,if-elseif語句,或者,如果您預計列表很長,作爲一種方法如下:

<?php 
function state($states) { 
    foreach($states as $state => $current) { 
     if($current) { 
      return $state; 
     } 
    } 
    return 'UNKNOWN'; 
} 

$states = array(
    'ALL' => $fault_all, 
    'TWOTHIRDS' => $fault_twothirds, 
    'ONETHIRD' => $fault_onethird 
); 

var_dump(state($states)); 

那說,這應該工作,我想:

<?php 
$error = ($fault_all ? "ALL" : ($fault_twothirds ? "TWOTHIRDS" : ($fault_onethird ? "ONETHIRD" : "UNKNOWN"))); 
+0

謝謝你和嵌套三元組的工作確實 !!我嘗試使用括號自己,但我錯誤地嵌套它們。 – TomaszRykala 2012-04-16 12:01:26

+0

@TomaszRykala不客氣。 – 2012-04-16 12:16:52

1

我建議你使用()不同ternaries從海誓山盟分開,或者使用if/else子句。

+0

'switch(TRUE)'在這裏也可以用於代碼清晰度 – DaveRandom 2012-04-16 11:47:01

+0

雖然我不是那種粉絲。但這只是品味:) – Nanne 2012-04-16 11:48:04

+0

夠公平的,雖然切換布爾值是非常有用的,當你有一大堆操作,所有的操作都返回一個值爲TRUE的值,並且你想打破這個過程,並在出現錯誤時處理它們中的一個失敗,反之亦然。 'case :'雖然(很像'goto'),它是一個非常有用/功能強大的構造,只能由懂得它的含義的人使用...... – DaveRandom 2012-04-16 11:56:24

1

這是一個已知的問題。 - veekun

就拿下面的嵌套三元...

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

打印'horse'

正如@漿果langerak規定使用控制流功能...

使用一個對象{array,structure}更加可靠... IE

$vehicle = (empty($vehicle) ? 

    array(

    'B' => 'Bus', 
    'A' => 'Airplane', 
    'T' => 'Train', 
    'C' => 'Car', 
    'H' => 'Horse', 

    ): 

    NULL 
); 

$arg = 'T'; 

$vehicle = (! empty($arg) ? $vehicle[$arg] : "You have to define a vehicle type"); 

echo($vehicle);