代码之家  ›  专栏  ›  技术社区  ›  mrateb

两次优先的空合并运算符[重复]

php
  •  0
  • mrateb  · 技术社区  · 5 年前

    我不明白那是怎么输出的。 four “”来了吗?

    $a = 2;
    
    echo
      $a == 1 ? 'one'   :
      $a == 2 ? 'two'   :
      $a == 3 ? 'three' :
      $a == 5 ? 'four'  : 
        'other'  
      ;
    
    // prints 'four'
    

    我不明白为什么” “打印出来。

    0 回复  |  直到 10 年前
        1
  •  27
  •   MGwynne    13 年前

    您需要将三元条件括起来:

    <?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 operator help .

    正在从左到右计算表达式。所以你实际上得到了:

      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。

        2
  •  6
  •   hakre    10 年前

    the Comparison Operators page in the PHP Manual 他们解释说php的行为是 "non-obvious" 嵌套(堆叠)三元运算符时。

    你写的代码是这样的:

    $a = 2;
    
    echo
      ((($a == 1  ? 'one'   :
         $a == 2) ? 'two'   :
         $a == 3) ? 'three' :
         $a == 5) ? 'four'  : 
           'other'
      ;
    
    // prints 'four'
    

    AS $a 是2而且都是 'two' 'three' 也是真的,你会得到 four “因此,你不再比较 'four' 是真是假。

    如果你想改变这一点,你必须把括号放在不同的地方[也被注:beingsimpler和mgwynne]:

    $a = 2;
    echo 
      ($a == 1 ? 'one'   :
      ($a == 2 ? 'two'   :
      ($a == 3 ? 'three' :
      ($a == 5 ? 'four'  : 
         'other'))))
      ;
    
    // prints 'two'
    
        3
  •  3
  •   user743234    13 年前

    分组条件有问题,只需要添加括号来分隔它们。

    $a = 2;
    echo (
    $a == 1 ? 'one' :
    ($a == 2 ? 'two' :
    ($a == 3 ? 'three' :
    ($a == 5 ? 'four' : 'other'))));
    echo "\n";
    // prints 'four'
    exit;
    

    解决了的。

        4
  •  1
  •   Jonathon    6 年前

    这就是我想出的帮助自己理解三元运算符的左与右关联性的方法。

    // PHP
    
    $a = "T";
    $vehicle =  $a == "B" ? "bus" :
                $a == "A" ? "airplane" :
                $a == "T" ? "train" :
                $a == "C" ? "car" :
                $a == "H" ? "horse" : "feet";
    
                // (as seen by the PHP interpreter)
                // INITIAL EXPRESSION: ((((($a == "B" ? "bus" : $a == "A") ? "airplane" : $a == "T") ? "train" : $a == "C") ? "car" : $a == "H") ? "horse" : "feet");
                // STEP 1:             (((((FALSE ? "bus" : FALSE) ? "airplane" : TRUE) ? "train" : FALSE) ? "car" : FALSE) ? "horse" : "feet")
                // STEP 2:             ((((FALSE ? "airplane" : TRUE) ? "train" : FALSE) ? "car" : FALSE) ? "horse" : "feet")
                // STEP 3:             (((TRUE ? "train" : FALSE) ? "car" : FALSE) ? "horse" : "feet")
                // STEP 4:             (("train" ? "car" : FALSE) ? "horse" : "feet")
                // STEP 5:             ("car" ? "horse" : "feet")
                // FINAL EVALUATION:   ("horse")
    
                // If you used the initial expression here (with the parenthesis) in a different language, it would also evaluate to "horse."
    
    echo $vehicle; // gives us "horse"
    

    这与:

    // EVERY OTHER LANGUAGE
    
    var a = "T";
    var vehicle =   a == "B" ? "bus" :
                    a == "A" ? "airplane" :
                    a == "T" ? "train" :
                    a == "C" ? "car" :
                    a == "H" ? "horse" : "feet";
    
                    // (as seen by the other language's interpreter)
                    // INITIAL EXPRESSION: (a == "B" ? "bus" : (a == "A" ? "airplane" : (a == "T" ? "train" : (a == "C" ? "car" : (a == "H" ? "horse" : "feet")))));
                    // STEP 1:             (FALSE ? "bus" : (FALSE ? "airplane" : (TRUE ? "train" : (FALSE ? "car" : (FALSE ? "horse" : "feet")))))
                    // STEP 2:             (FALSE ? "bus" : (FALSE ? "airplane" : (TRUE ? "train" : (FALSE ? "car" : "feet"))))
                    // STEP 3:             (FALSE ? "bus" : (FALSE ? "airplane" : (TRUE ? "train" : "feet")))
                    // STEP 4:             (FALSE ? "bus" : (FALSE ? "airplane" : "train"))
                    // STEP 5:             (FALSE ? "bus" : "train")
                    // FINAL EVALUATION:   ("train")
    
                    // If you used the initial expression here (with the parenthesis) in PHP, it would also evaluate to "train."
    
    console.log(vehicle); // gives us "train"
    

    如果您注意到,在php示例中,最里面的表达式在左侧,而在第二个示例中,最里面的表达式在右侧。每个步骤计算下一个最里面的表达式,直到有一个结果为止。如果要在php中嵌套三元操作,括号显然非常重要!