在PHP中堆叠多个三元运算符

时间:2011-03-08 16:54:28

标签: php operators ternary-operator

这就是我写的:

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

但是对于每个领域我都得到了值city-4。我想使用三元运算符而不是switch/if,因为我想进行实验,看看它是如何完成的。

此代码有什么问题?

10 个答案:

答案 0 :(得分:85)

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

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

Updated Link

答案 1 :(得分:30)

从左到右评估三元运算符。因此,如果您没有正确分组表达式,您将得到意外的结果。

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

答案 2 :(得分:17)

不要滥用三元运算符来做这类事情。它使调试几乎无法遵循。为什么不做像

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

或者只是链接if / then / else

if ($province == 6) {
     $Myprovince = "city-1";
} elseif ($province = ...) {
   ...
}

答案 3 :(得分:12)

有些人建议使用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语句很难维护。

答案 4 :(得分:4)

我理解这是一个关于PHP的问题,但是因为这只是一个教育练习,我认为你可能有兴趣了解Ruby和Javascript实际上就像你期望的那样。

红宝石:

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"

答案 5 :(得分:3)

尝试使用更多的括号:

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

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

但我认为您应该放弃此运算符并尝试使用switch代替。

答案 6 :(得分:0)

请改用开关。三元运算符实际上不应该用于单一条件,因为它们很快就变得非常难以理解。

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';
}

答案 7 :(得分:0)

我今天陷入了同样的问题。其他人已经给出了可接受的解决方案。如果只是一个班轮的话,我的工作就是重点。我认为更具可读性。

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)

我认为在 PHP 中编写嵌套三元运算符的更易读的方式是这样的:

$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";

答案 9 :(得分:-1)

我认为这就是您要找的:

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