Я не понимаю, как это выход (« four
»)?
$a = 2; echo $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 5 ? 'four' : 'other' ; // prints 'four'
Я не понимаю, почему « four
» печатаются.
Вам нужно скопировать тернарные условные обозначения:
<?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;
Решаемые.