Подтвердить что ты не робот

Как конкатенировать несколько тернарных операторов в PHP?

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

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

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

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

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

4b9b3361

Ответ 1

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

Try

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

Ответ 2

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

Вам нужно использовать круглые скобки:

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

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

Ответ 3

Вам нужны скобки вокруг правого операнда:

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

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

Ответ 4

Вы можете написать это правильно, таким образом:

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

(т.е. просто вставляем "внутренний" тернарный оператор в скобки.)

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

Просто скопируйте скобки, и у вас есть это:

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

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

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

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

Ответ 8

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

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