0

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

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

它们按我的偏好从左到右的顺序列出,所以如果 $fault_all 和 $fault_twothirds 为真,我希望将“ALL”分配给 $error; 如果它们都为真,则相同。如果全部为假,则应将“未知”分配给错误。

但是,如果其中任何一个为真,则仅返回“ONETHIRD”,如果返回所有假“UNKNOWN”。如何让“ALL”和“TWOTHIRDS”被退回?

4

3 回答 3

2

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

于 2012-04-16T11:45:51.200 回答
1

就能够调试和管理状态列表而言,我建议停止使用不可读的三元组,并使用 switch、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" ) ) );
于 2012-04-16T11:56:09.050 回答
1

这是一个已知的问题。——维坤

以下面的嵌套三元为例...

<?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} 更可靠... 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);
于 2012-10-05T15:08:16.067 回答