Как объединить несколько тернарных операторов в PHP? - PullRequest
13 голосов
/ 01 июня 2011

Я часто использую троичные операторы, но я не могу сложить несколько тернарных операторов друг в друга.

Я знаю, что сложение нескольких троичных операторов сделает код менее читабельным , но в некоторых случаях я бы нравится делать это.

Это то, что я пробовал до сих пор:

$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1

Какой правильный синтаксис?

Ответы [ 8 ]

27 голосов
/ 01 июня 2011

Эти круглые скобки - это то, что, я думаю, тебя заводит

Попробуйте

$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2)  ? "2" : "other");
echo $bar;
18 голосов
/ 01 июня 2011

Проблема в том, что PHP, , в отличие от всех других языков , делает условный оператор левоассоциативным. Это нарушает ваш код - что было бы хорошо на других языках.

Вам необходимо использовать скобки:

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

(Обратите внимание, что я удалил другие скобки из вашего кода; но они были правильными, просто излишними.)

8 голосов
/ 01 июня 2011

Вам нужно несколько скобок вокруг правого ручного операнда:

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

Интерпретатор PHP не работает и обрабатывает вашу строку:

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

как

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

, и поскольку это левое выражение оценивается как "true", вместо него возвращается первый операнд оставшегося троичного оператора ("2").

4 голосов
/ 01 июня 2011

Вы могли бы написать это правильно так:

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

(т. Е. Просто вставить «внутренний» троичный оператор в скобки.)

Тем не менее, я бы действительно испытывал бы искушение не делать этого, поскольку он почти так же читабелен, как и особенно неразборчивая вещь, которая была испачкана грязью - нет никакого оправдания для запутывания кода, и это граничит с ним .

3 голосов
/ 01 июня 2011

Поставьте круглые скобки вокруг каждого внутреннего троичного оператора, таким образом гарантируется приоритет оператора:

$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
2 голосов
/ 01 июня 2011
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : (( $foo == 2 ) ? "2" : "other");
echo $bar;

Просто используйте extra (), и оно будет работать

2 голосов
/ 01 июня 2011

Просто сложите скобки, и вы получите:

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

Кроме того, если у вас есть много предложений, вы должны рассмотреть возможность использования switch:

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

Если переключатель становится длинным, вы можете заключить его в функцию.

2 голосов
/ 01 июня 2011

Добавьте скобки:

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