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

php中的致命错误表示不支持Unparenthesized[duplicate]

  •  -1
  • JS3  · 技术社区  · 5 年前

    这是我写的:

     $Myprovince = (
    ($province == 6) ? "city-1" :
    ($province == 7) ? "city-2" :
    ($province == 8) ? "city-3" :
    ($province == 30) ? "city-4" : "out of borders"
    );
    

    city-4 . 我想用三元运算符代替 switch/if 因为我想做个实验看看会怎样。

    0 回复  |  直到 15 年前
        1
  •  100
  •   Sagar Ahuja    8 年前

    其他人已经建议了正确的方法,但是如果你真的想使用三元运算符,你需要使用括号:

    $province = 7;
     $Myprovince = (
     ($province == 6) ? "city-1" :
      (($province == 7) ? "city-2" :
       (($province == 8) ? "city-3" :
        (($province == 30) ? "city-4" : "out of borders")))
     );
    

    Updated Link

        2
  •  35
  •   Community Mohan Dere    9 年前

    三元运算符从左到右求值。因此,如果不正确地对表达式进行分组,将得到意外的结果。

    PHP's advice is [docs] :

    建议您避免“堆叠”三元表达式。在一条语句中使用多个三元运算符时,PHP的行为并不明显。

    您的代码实际计算为:

    (
        (
            (
                $province == 6 ? "city-1" : $province == 7
            ) ? "city-2" : 
            $province == 8
        ) ? "city-3" : $province == 30
    ) ? "city-4" : "out of borders";
    

    $province == 6 ? "city-1" : (
        $province == 7 ? "city-2" : (
            $province == 8 ? "city-3" : (
               $province == 30 ? "city-4" : "out of borders"
            )
        )
    );
    

    这段代码可能看起来不错,但有人会阅读它,他们需要更多的时间来理解这段代码在做什么。


    你最好这样做:

    $map = array( 6 = >'city-1', 
                  7 => 'city-2', 
                  8 => 'city-3', 
                 30 => 'city-4');
    
    $Myprovince = "out of borders";
    
    if(array_key_exists($province, $map)) {
        $Myprovince = $map[$province];
    }
    

    或作为 @Jonah 他在评论中提到:

    $Myprovince = isset($map[$province]) ? $map[$province] : 'out of borders';
    
        3
  •  18
  •   Marc B    15 年前

    switch($province) {
        case 6: $Myprovince = "city-1"; break;
        case 7: ...
    }
    

    或者仅仅是一些被锁着的if/then/else

    if ($province == 6) {
         $Myprovince = "city-1";
    } elseif ($province = ...) {
       ...
    }
    
        4
  •  12
  •   arnorhs    15 年前

    有些人建议使用switch语句或if/else语句。但我会使用数组来代替,以使其更易于维护和读取:

    $provinces = array (
        6 => 'city-1',
        7 => 'city-2',
        8 => 'city-3',
        30 => 'city-4'
    );
    
    // then you can call:
    
    $Myprovince = isset($provinces[$province]) ? $provinces[$province] : 'out of borders';
    

    为什么?

    代码最终可能会更易于管理。也许有一天你会想从数据库中添加这些省到市的映射。。等。。这将很难用一堆switch/case语句来维持。

        5
  •  5
  •   Noah    13 年前

    红宝石:

    ree-1.8.7-2012.02 :009 > def foo x
    ree-1.8.7-2012.02 :010?>   x == 1 ? "city 1" : x == 2 ? "city 2" : "out of borders"
    ree-1.8.7-2012.02 :011?>   end
     => nil
    ree-1.8.7-2012.02 :012 > foo 1
     => "city 1"
    ree-1.8.7-2012.02 :013 > foo 2
     => "city 2"
    ree-1.8.7-2012.02 :014 > foo 3
     => "out of borders"
    

    Javascript代码:

    > function f(x) { return x == 1 ? "city 1" : x == 2 ? "city 2" : "out of borders"; }
    undefined
    > f(1)
    "city 1"
    > f(2)
    "city 2"
    > f(3)
    "out of borders"
    
        6
  •  3
  •   krtek    15 年前

    再加一些括号:

    $Myprovince = (
    ($province == 6) ? "city-1" :
    (($province == 7) ? "city-2" :
    (($province == 8) ? "city-3" :
    (($province == 30) ? "city-4" : "out of borders"
    ))));
    

    您的代码有三元运算符优先级问题。

    但我觉得你真的应该放弃这个操作符,试着用一个 switch 相反。

        7
  •  1
  •   Fandi Susanto    7 年前

    我今天也遇到了同样的问题。其他人已经给出了可以接受的解决方案。我只是强调一句话。在我看来更具可读性。

    if ($province == 6) $Myprovince = 'city-1';
    elseif ($province == 7) $Myprovince = 'city-2';
    elseif ($province == 8) $Myprovince = 'city-3';
    elseif ($province == 30) $Myprovince = 'city-4';
    else $Myprovince = 'out of borders';
    
        8
  •  0
  •   Jonah    15 年前

    改用开关。三元运算符真的不应该只用于单个条件,因为它们很快就会变得很难理解。

    switch ($province) {
        case 6:
            $Myprovince = 'city-1';
            break;
        case 7:
            $Myprovince = 'city-2';
            break;
        case 8:
            $Myprovince = 'city-3';
            break;
        case 30:
            $Myprovince = 'city-4';
            break;
        default:
            $Myprovince = 'out of borders';
    }
    
        9
  •  0
  •   Dharman vijay    5 年前

    $myprovince =
        $province ==  6 ? "city-1" : (
        $province ==  7 ? "city-2" : (
        $province ==  8 ? "city-3" : (
        $province == 30 ? "city-4" : "out of borders" )));
    

    你所要做的就是数一数左括号的数目( ( )加上相同数目的右括号( ) )在最后一行的末尾。

    另一种选择是使用一行if/elseif/else,正如前面所建议的那样-但是,为了更易于阅读,我会像这样直观地格式化它们:

    if      ($province == 6)  $myprovince = "city-1";
    elseif  ($province == 7)  $myprovince = "city-2";
    elseif  ($province == 8)  $myprovince = "city-3";
    elseif  ($province == 30) $myprovince = "city-4";
    else                      $myprovince = "out of borders";
    
        10
  •  -1
  •   Tarik    5 年前

    我想这就是你想要的:

    echo "<p style='color:".($number > 0 ? "green" : ($number  == 0 ? "black" : "red"))."'>".number_format($number, 2)."</p>";