How to concatenate multiple ternary operator in PHP?

馋奶兔 提交于 2019-11-27 05:03:10

Those parenthesis are what I think is getting you.

Try

$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2)  ? "2" : "other");
echo $bar;

The problem is that PHP, unlike all other languages, makes the conditional operator left associative. This breaks your code – which would be fine in other languages.

You need to use parentheses:

$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");

(Notice that I’ve removed the other parentheses from your code; but these were correct, just redundant.)

You need some parentheses around the right hand operand:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;

PHP's interpreter is broken, and treats your line:

$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";

as

$bar = (( $foo == 1) ? "1" : ( $foo == 2)) ? "2" : "other";

and since that left hand expression evaluates as "true" the first operand of the remaining ternary operator ("2") is returned instead.

You could write this correctly thus:

$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");

(i.e.: Simply embed the 'inner' ternary operator in parenthesis.)

However, I'd be really tempted not to do this, as it's about as readable as a particularly illegible thing that's been badly smudged - there's never any excuse for obfuscating code, and this borders on it.

Put parenthesis around each inner ternary operator, this way operator priority is assured:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");

Add the parenthesis:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");

Just stack up the parenthesis, and you've got it:

$bar = ($foo==1? "1" : ($foo==2? "2" : "other"));

As an aside, if you've got many clauses, you should consider using a switch:

switch ( $bar ) {
  case 1:  echo "1";
  case 2:  echo "2";
  default: echo "other";
}

If the switch gets long, you can wrap it in a function.

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;

Just use extra ( ) and it will work

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