Ответ 1
Эти скобки - это то, что я думаю, что вы получаете.
Try
$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");
echo $bar;
Я использую тройные операторы много, но я не могу представить несколько тройных операторов внутри друг друга.
Я знаю, что укладка нескольких тернарных операторов будет сделать код менее удобочитаемым, но в некоторых случаях я бы как сделать это.
Это то, что я пробовал до сих пор:
$foo = 1;
$bar = ( $foo == 1 ) ? "1" : ( $foo == 2 ) ? "2" : "other";
echo $bar; // display 2 instead of 1
Каков правильный синтаксис?
Эти скобки - это то, что я думаю, что вы получаете.
Try
$foo = 1;
$bar = ($foo == 1) ? "1" : (($foo == 2) ? "2" : "other");
echo $bar;
Проблема в том, что PHP, в отличие от всех других языков, делает условный оператор левым ассоциативным. Это нарушает ваш код - что будет хорошо на других языках.
Вам нужно использовать круглые скобки:
$bar = $foo == 1 ? "1" : ($foo == 2 ? "2" : "other");
(Обратите внимание, что Ive удалил другие скобки из вашего кода, но они были правильными, просто избыточными.)
Вам нужны скобки вокруг правого операнда:
$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(), и он будет работать