PHP嵌套三元问题

时间:2012-04-16 11:39:52

标签: php ternary

我的代码中有嵌套的三元运算符,如下所示:

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

它们按照我的偏好从左到右的顺序列出,所以如果$ fault_all和$ fault_twothirds为真,我希望将“ALL”分配给$ error;如果所有这些都是真的,也是一样的。如果全部为假,则应将“UNKNOWN”分配给错误。

但是,如果其中任何一个为真,则仅返回“ONETHIRD”,如果返回所有错误的“UNKNOWN”。如何让“ALL”和“TWOTHIRDS”归还?

3 个答案:

答案 0 :(得分:1)

我建议您使用()将不同的三元组分开,或使用if / else子句。

答案 1 :(得分: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" ) ) );

答案 2 :(得分: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'

正如@ berry-langerak所述,使用控制流功能......

使用对象{array,structure}更可靠... I.E.

$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);