Понимание вложенного PHP-тернарного оператора

Я не понимаю, как это выход (« four »)?

 $a = 2; echo $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 5 ? 'four' : 'other' ; // prints 'four' 

Я не понимаю, почему « four » печатаются.

Related of "Понимание вложенного PHP-тернарного оператора"

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

 <?php for ($a=0; $a < 7; $a++) { echo ( $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 5 ? 'four' : 'other')))); echo "\n"; // prints 'four' } exit; ?> 

возвращает:

 other one two three other four other 

как и следовало ожидать.

См. Примечание внизу «Тернарных операторов» при помощи PHP Ternary .

Выражения оцениваются слева направо. Таким образом, вы фактически получаете:

  echo ( ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 5) ? 'four' : 'other'); 

Итак, для $a=2 вы получаете:

  echo ( ((($a==2) ? 'two' : $a == 3) ? 'three' : $a == 5) ? 'four' : 'other'); 

а потом

  echo ( ((true ? 'two' : $a == 3) ? 'three' : $a == 5) ? 'four' : 'other'); 

а потом

  echo ( ('two' ? 'three' : $a == 5) ? 'four' : 'other'); 

а потом

  echo ( 'three' ? 'four' : 'other'); 

и так echo 'four' .

Помните, что PHP динамически типизируется и обрабатывает любые ненулевые ненулевые значения как TRUE.

На странице « Операторы сравнения» в Руководстве по PHP они объясняют, что поведение PHP «неочевидно» при тройственных операторах вложения (стекирования).

Код, который вы написали, выглядит следующим образом:

 $a = 2; echo ((($a == 1 ? 'one' : $a == 2) ? 'two' : $a == 3) ? 'three' : $a == 5) ? 'four' : 'other' ; // prints 'four' 

Поскольку $a равно 2, и оба 'two' и 'three' являются ИСТИННЫМИ, вы получаете « four » в качестве результата, так как вы больше не сравниваете, если 'four' TRUE или нет.

Если вы хотите изменить это, вы должны поместить скобки в разные места [также отмеченные: BeingSimpler и MGwynne]:

 $a = 2; echo ($a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 5 ? 'four' : 'other')))) ; // prints 'two' 

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

 $a = 2; echo ( $a == 1 ? 'one' : ($a == 2 ? 'two' : ($a == 3 ? 'three' : ($a == 5 ? 'four' : 'other')))); echo "\n"; // prints 'four' exit; 

Решаемые.