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

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

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

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

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

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

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

Пытаться

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

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

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

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

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

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

 $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»).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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