PHP中多个三值运算符的叠加

PHP中多个三值运算符的叠加,php,operators,ternary-operator,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,因为我想进行实验,看看它是如何实现的 这段代码有什么问题?不要滥用三元运算符来处

这是我写的:

 $Myprovince = (
($province == 6) ? "city-1" :
($province == 7) ? "city-2" :
($province == 8) ? "city-3" :
($province == 30) ? "city-4" : "out of borders"
);
但对于每个字段,我都得到了值
city-4
。我想使用三元运算符,而不是
switch/if
,因为我想进行实验,看看它是如何实现的


这段代码有什么问题?

不要滥用三元运算符来处理这类事情。这使得调试几乎无法进行。为什么不做类似的事情呢

switch($province) {
    case 6: $Myprovince = "city-1"; break;
    case 7: ...
}
或者仅仅是一些被锁的if/then/else

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

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

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

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

:

建议您避免“堆叠”三元表达式。当在一条语句中使用多个三元运算符时,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];
}
$myprovince =
    $province ==  6 ? "city-1" : (
    $province ==  7 ? "city-2" : (
    $province ==  8 ? "city-3" : (
    $province == 30 ? "city-4" : "out of borders" )));
或者正如他在评论中提到的:

$Myprovince = isset($map[$province]) ? $map[$province] : 'out of borders';

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

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

尝试使用更多的括号:

$Myprovince = (
($province == 6) ? "city-1" :
(($province == 7) ? "city-2" :
(($province == 8) ? "city-3" :
(($province == 30) ? "city-4" : "out of borders"
))));
您的代码有三元运算符优先级问题


但是我认为你真的应该放弃这个操作符,试着用
开关来代替。

一些人建议使用开关语句或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语句来维护。

我知道这是一个关于PHP的问题,但由于这只是一个教育性的练习,所以我想您可能有兴趣了解Ruby和Javascript实际上是按照您期望的方式运行的

红宝石:

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"

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

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

我想这就是你想要的:

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

”.number\u格式($number,2)。“

”;
我认为在PHP中编写嵌套三元运算符的可读性更强的方法如下:

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


您不想只使用
if/elseif
开关
有什么原因吗?您需要更多的括号才能使用。用户a
开关
,如Marc所建议。由于很好的原因,不建议使用具有复杂嵌套条件的三元运算符。。。因为它们充满了问题,而且识别bug非常困难。你刚刚发现了这个!如果你真的知道如何使用它们,你就不会寻求帮助了!那么,在这种情况下,你为什么还要使用三元运算符呢?请检查下面的答案:上帝,求你了,我不会在实时脚本中使用这种方法,永远不会,你现在好些了吗?只是好奇如何使用它:Ddidn我不是说过因为某些原因我坚持使用十进制运算符吗?@Mac Taylor:不,你没有。原因是什么?默默无闻?@Felix:也许是在调试受虐狂?三元组的最大好处是它允许有一个单变量赋值。用这个使它更简短:
$Myprovince=isset($map[$province])$地图[$省]:“境外”;-)@乔纳:真的:我想我想我想尽量远离三元运算符;)为了便于编辑,我相信其他几行是前面几行的c语句。注意,没有分号。几乎就是:
($province==6)?“城市1”:($province==7)?“城市2”:(省==8)?“城市3”:(省=30)?“城市4”:“境外”@Phoenix:是的,我注意到了并修复了它。我被这一切弄糊涂了。
;)PHP是三元运算符语言中唯一一种工作方式不同于其他语言实现的语言:如果你能勇敢地将其输入,我会感到不寒而栗,但我不能让自己“认可”这样一件可怕的事情……这确实是一种“正确”的方式。但我永远不会尝试这样的事情。我绝对会为你保证+1persevering@Mac泰勒:你用错工具了。关于这件事没什么可说的了。您还可以使用字符串连接创建字符串
'abc'
'a.'b.'c'
,但为什么要这样做呢?为你的三元野兽添加一个新城市,玩得开心,别忘了数数以匹配括号!我认为拒绝使用链式三元作为编程模式不是一个好的回应。它使许多语言的代码简洁明了,能够“正确”地实现它,并且因为它生成了一个表达式,有时它是快速修复某些东西的唯一方法。我之所以使用引号,是因为尽管PHP设计人员做出了愚蠢的选择,使其三元运算符保持关联,但事实已经有了很好的证明。绝对是最好的答案!这个不错。不过要小心“内存不足”的问题。耸耸肩。。。当然,Ruby和Javascript已经做到了。。。毕竟它们是编程语言这是一个比switch更干净的解决方案