Я использую тройные операторы много, но я не могу представить несколько тройных операторов внутри друг друга.
Я знаю, что укладка нескольких тернарных операторов сделает код менее читаемым, но в некоторых случаях я хотел бы это сделать.
Это то, что я пробовал до сих пор:
$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 (), и он будет работать