不寻常的三元手术

时间:2010-04-17 14:27:54

标签: php logic ternary-operator logical-operators

我被要求执行三元运算符使用的这个操作:

$test='one';

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

哪个打印两个(使用php检查)。

我仍然不确定这个的逻辑。拜托,任何人都可以告诉我这个逻辑。

7 个答案:

答案 0 :(得分:15)

嗯,好吗?并且:具有相同的优先级,因此PHP将从左到右解析依次评估每个位:

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

首先$test == 'one'返回true,所以第一个parens的值为'one'。现在,第二个三元评估如下:

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

'one'为真(非空字符串),因此'two'是最终结果。

答案 1 :(得分:7)

基本上,解释器从左到右评估这个表达式,所以:

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

被解释为

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

并且paratheses中的表达式评估为true,因为'one'和'two'都不是null / o /其他形式的false。 所以,如果它看起来像:

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

它将打印三个。为了使它工作正常,您应该忘记组合三元运算符,并使用常规ifs / switch来处理更复杂的逻辑,或者至少使用括号,以便解释器理解您的逻辑,而不是以标准LTR方式执行检查:< / p>

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...
}

答案 2 :(得分:5)

使用括号时,它可以正常工作:

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

我不理解它100%但没有括号,对于翻译,声明必须如下:

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

第一个条件的结果似乎是整个三元操作的结果。

答案 3 :(得分:1)

PHP'documentation说:

  

注意:建议您避免“堆叠”三元表达式。 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');

答案 4 :(得分:1)

我认为它是这样评估的:

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

($ test =='one'?'one':$ test =='two')非零/ null,所以'two'是逻辑输出

如果您希望它正常工作,请写:

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

答案 5 :(得分:1)

三元运算符按照出现的顺序执行,所以你真的有:

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

答案 6 :(得分:0)

嵌套的三元操作非常糟糕!以上解释说明原因。

基本上这是逻辑:

is $test == 'one'

  if TRUE then echo 'one'

  else is $test == 'two'

      if TRUE then echo 'two'

      else echo three