Меня попросили выполнить эту операцию использования тернарного оператора:
$test='one';
echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';
Который печатает два (проверенное использование php).
Я все еще не уверен в логике для этого. Может кто-либо говорить мне логику для этого.
Ну, а? и: имеют равный приоритет, поэтому PHP будет анализировать слева направо, оценивая каждый бит по очереди:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
First $ test == 'one'
возвращает true, поэтому первые скобки имеют значение 'one'. Теперь вторая тройка вычисляется следующим образом:
'one' /*returned by first ternary*/ ? 'two' : 'three'
'one' истинно (непустая строка), поэтому 'two' является окончательным результатом.
Вложенные тернарные операции ужасны! Приведенное выше объяснение показывает, почему.
В основном это логика:
is $test == 'one'
if TRUE then echo 'one'
else is $test == 'two'
if TRUE then echo 'two'
else echo three
Он работает правильно, когда вы используете скобки:
<?
$test='one';
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
Я не понимаю на 100%, но без скобок, для интерпретатора, оператор должен выглядеть так:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
результат первого условия кажется возвращенным как результат всей тернарной операции.
Обычно интерпретатор оценивает это выражение слева направо, поэтому:
echo $test == 'one' ? 'one' : $test == 'two' ? 'two' : 'three';
интерпретируется как
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
И выражение в параграфах оценивается как истинное, поскольку оба 'one' и 'two' не являются null / o / другой формой false. Итак, если бы это выглядело так:
echo $test == 'one' ? FALSE : $test == 'two' ? 'two' : 'three';
Он напечатал бы three. Чтобы он работал нормально, вам следует забыть об объединении тернарных операторов и использовать обычные ifs / switch для более сложной логики или, по крайней мере, использовать скобки, чтобы интерпретатор понимал вашу логику, а не выполнял проверку стандартным способом LTR:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : ($test == 'three' ? 'three' : 'four'));
//etc... It's not the most understandable code...
//You better use:
if($test == 'one')
echo 'one';
else { //or elseif()
...
}
//Or:
switch($test) {
case 'one':
echo 'one';
break;
case 'two':
echo 'two';
break;
//and so on...
}
Я думаю, что это оценивается так:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';
($ test == 'one '?' one ': $ test ==' two ') не равно нулю / null, поэтому' two 'является логическим выводом
, если вы хотите, чтобы он работал c Правильно напишите:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
Примечание: Рекомендуется избегать "складывания" тернарных выражений . Поведение PHP при использовании более чем одного тернарного оператора в одном операторе неочевидно:
Пример № 3 Неочевидное тернарное поведение
Php // на первый взгляд кажется, что следующее output 'true' echo (true? 'true': false? 't': 'f'); // однако фактический вывод вышеуказанного будет ' t ' // это потому, что троичные выражения вычисляются слева направо // ниже приводится более очевидная версия того же кода, что и выше echo ((true? 'true': false)? 't': 'f'); // здесь вы можете видеть, что первое выражение оценивается как 'true', что //, в свою очередь, возвращает значение (bool) true, возвращая тем самым истинную ветвь // второго тернарного выражения. ?>
If вы помещаете скобки вокруг ложного утверждения, он выводит один
:
echo $test == 'one' ? 'one' : ($test == 'two' ? 'two' : 'three');
Тернарные операторы выполняются в порядке появления, так что у вас действительно получится:
echo ($test == 'one' ? 'one' : $test == 'two') ? 'two' : 'three';