Вопрос

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

$test='one';

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

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

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

Это было полезно?

Решение

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

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

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

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

«One» верно (непустая строка), поэтому «два» является конечным результатом.

Другие советы

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

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

интерпретируется как

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

И выражение в Paratheses оценивает true, поскольку как «One», так и «два» не являются NULL / O / другим формой false. Так что если это будет выглядеть так:

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

Это будет печатать три. Чтобы сделать его работать хорошо, вы должны забыть о комбинировании тройных операторов и использовать регулярный IFS / переключатель для более сложной логики или, по крайней мере, используйте кронштейны, для интерпретатора, чтобы понять вашу логику, и не выполнять проверку стандартных 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...
}

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

<?
 $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';

($ test == 'One'? 'One': $ test == «два») не нулевой / NULL, поэтому «два» является логическим выходом

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

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

PHP's. документация говорит:

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

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

<?php
// on first glance, the following appears to output 'true'
echo (true?'true':false?'t':'f');

// however, the actual output of the above is 't'
// this is because ternary expressions are evaluated from left to right

// the following is a more obvious version of the same code as above
echo ((true ? 'true' : false) ? 't' : 'f');

// here, you can see that the first expression is evaluated to 'true', which
// in turn evaluates to (bool)true, thus returning the true branch of the
// second ternary expression.
?>

Если вы поставьте скобки вокруг ложного оператора, он печатает one:

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

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

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

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

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

is $test == 'one'

  if TRUE then echo 'one'

  else is $test == 'two'

      if TRUE then echo 'two'

      else echo three
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top