2012-04-16 54 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);