необычная троичная операция

Меня попросили выполнить эту операцию использования тернарного оператора:

$test='one';

echo $test == 'one' ? 'one' :  $test == 'two' ? 'two' : 'three';

Который печатает два (проверенное использование php).

Я все еще не уверен в логике для этого. Может кто-либо говорить мне логику для этого.

14
задан Kali Charan Rajput 16 June 2010 в 08:57
поделиться

7 ответов

Ну, а? и: имеют равный приоритет, поэтому PHP будет анализировать слева направо, оценивая каждый бит по очереди:

echo ($test == 'one' ? 'one' :  $test == 'two') ? 'two' : 'three';

First $ test == 'one' возвращает true, поэтому первые скобки имеют значение 'one'. Теперь вторая тройка вычисляется следующим образом:

'one' /*returned by first ternary*/ ? 'two' : 'three'

'one' истинно (непустая строка), поэтому 'two' является окончательным результатом.

15
ответ дан 1 December 2019 в 09:01
поделиться

Вложенные тернарные операции ужасны! Приведенное выше объяснение показывает, почему.

В основном это логика:

is $test == 'one'

  if TRUE then echo 'one'

  else is $test == 'two'

      if TRUE then echo 'two'

      else echo three
0
ответ дан 1 December 2019 в 09:01
поделиться

Он работает правильно, когда вы используете скобки:

<?
 $test='one';
 echo $test == 'one' ? 'one' :  ($test == 'two' ? 'two' : 'three');

Я не понимаю на 100%, но без скобок, для интерпретатора, оператор должен выглядеть так:

echo ($test == 'one' ? 'one' :  $test == 'two') ? 'two' : 'three';

результат первого условия кажется возвращенным как результат всей тернарной операции.

5
ответ дан 1 December 2019 в 09:01
поделиться

Обычно интерпретатор оценивает это выражение слева направо, поэтому:

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...
}
7
ответ дан 1 December 2019 в 09:01
поделиться

Я думаю, что это оценивается так:

echo ($test == 'one' ? 'one' :  $test == 'two') ? 'two' : 'three';

($ test == 'one '?' one ': $ test ==' two ') не равно нулю / null, поэтому' two 'является логическим выводом

, если вы хотите, чтобы он работал c Правильно напишите:

echo $test == 'one' ? 'one' :  ($test == 'two' ? 'two' : 'three');
1
ответ дан 1 December 2019 в 09:01
поделиться

Документация PHP говорит:

Примечание: Рекомендуется избегать "складывания" тернарных выражений . Поведение PHP при использовании более чем одного тернарного оператора в одном операторе неочевидно:

Пример № 3 Неочевидное тернарное поведение

  
 

If вы помещаете скобки вокруг ложного утверждения, он выводит один :

echo $test == 'one' ? 'one' :  ($test == 'two' ? 'two' : 'three');
1
ответ дан 1 December 2019 в 09:01
поделиться

Тернарные операторы выполняются в порядке появления, так что у вас действительно получится:

echo ($test == 'one' ? 'one' :  $test == 'two') ? 'two' : 'three';
1
ответ дан 1 December 2019 в 09:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: