PHP nested ternary issue

空扰寡人 提交于 2019-12-12 01:52:50

问题


I've got nested ternary operators in my code like this:

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

They are listed in order of my preference left to right so if $fault_all and $fault_twothirds are true, I want "ALL" to be assigned to $error; The same if all of them are true. If all are false "UNKNOWN" should be assigned to error.

However, if any of them are true only "ONETHIRD" is returned, if all false "UNKNOWN" is returned. How do I make the "ALL" and "TWOTHIRDS" to be returned?


回答1:


In terms of being able to debug and manage a list of states, I would recommend stopping usage of a ternary, which is unreadable, and use a switch, an if-elseif statement, or, if you anticipate a long list, an approach as follows:

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

That said, this should work, I think:

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



回答2:


I suggest you use ( and ) to separate the different ternaries from eachother, or use if/else clauses.




回答3:


This is a known issue. -- veekun

Take for instance the following nested ternary ...

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

prints 'horse'

As @berry-langerak stated use a control flow function ...

Using an object {array, structure} is much more reliable ... 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);


来源:https://stackoverflow.com/questions/10173383/php-nested-ternary-issue

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!