如何编写PHP三元运算符


72

如何用elseif部分编写PHP三元运算符?

我看到了带有PHP三元运算符ifelse部分的基本示例,如下所示:

echo (true)  ? "yes" : "no";    //prints yes
echo (false) ? "yes" : "no";    //prints no

我如何将这样的“ elseif”部分放入三元运算符中?

<?php 
  if($result->vocation == 1){
    echo "Sorcerer"; 
  }else if($result->vocation == 2){
    echo 'Druid';
  }else if($result->vocation == 3){
    echo 'Paladin';
  }else if($result->vocation == 4){
    echo 'Knight';
  }else if($result->vocation == 5){
    echo 'Master Sorcerer';
  }else if($result->vocation == 6){
    echo 'Elder Druid';
  }else if($result->vocation == 7){
    echo 'Royal Paladin';
  }else{
    echo 'Elite Knight';
  }
?>

4
您最好使用开关,甚至更好的阵列查找图。根据定义,三元是if-then-else。编写三元尝试并做自己想做的事情将很难阅读/遵循。
random_user_name 2013年

@cale_b您能否澄清一下?我仍在学习PHP,在我的工作中,我仅使用过if-elseif-else语句,因此我对所有这些内容不太熟悉。
dynamitem

我在下面举了一个例子。如果您不打算使用数据库,那么此解决方案是干净的并且易于理解。
random_user_name 2013年

Answers:


121

三元不是您想要的一个很好的解决方案。它不会在您的代码中可读,并且有很多更好的解决方案可用。

为什么不使用数组查找“ map”或“ dictionary”,如下所示:

$vocations = array(
    1 => "Sorcerer",
    2 => "Druid",
    3 => "Paladin",
    ...
);

echo $vocations[$result->vocation];

此应用程序的三元最终看起来像这样:

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

为什么这样不好?因为-作为一条长长的线,如果这里出现问题,您将不会获得有效的调试信息,因此长度很难读取,而且多个三元组的嵌套感觉很奇怪。

标准三元级简单易读,看起来像这样:

$value = ($condition) ? 'Truthy Value' : 'Falsey Value';

要么

echo ($some_condition) ? 'The condition is true!' : 'The condition is false.';

三元实际上只是一种编写简单if else语句的便捷方法。上面的三元示例与:

if ($some_condition) {
    echo 'The condition is true!';
} else {
    echo 'The condition is false!';
}

但是,用于复杂逻辑的三元数很快就变得不可读,因此不再值得一提。

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

即使使用了一些细心的格式将其分布在多行中,也不是很清楚:

echo($result->group_id == 1 
    ? "Player" 
    : ($result->group_id == 2 
        ? "Gamemaster" 
        : ($result->group_id == 3 
            ? "God" 
            : "unknown")));

除了执行此操作外,$qvar = isset($_GET['qvar']) ? $_GET['qvar'] : 'default';我们$qvar = $_GET['qvar'] ?? 'default'; 不确定是否引入了哪个PHP版本?
AhmadKarim

12

因为这是一项常见的任务,所以我建议将一个开关/外壳包装在一个函数调用中。

function getVocationName($vocation){
    switch($vocation){
        case 1: return "Sorcerer";
        case 2: return 'Druid';
        case 3: return 'Paladin';
        case 4: return 'Knight';
        case 5: return 'Master Sorcerer';
        case 6: return 'Elder Druid';
        case 7: return 'Royal Paladin';
        default: return 'Elite Knight';
    }
}

echo getVocationName($result->vocation);

28
使用时,breaks是多余的return
mpen 2014年

8
echo ($result ->vocation == 1) ? 'Sorcerer'
        : ($result->vocation == 2) ? 'Druid'
           :  ($result->vocation == 3) ? 'Paladin'
                    ....

;

这有点丑陋。您应该坚持正常的if说法。


2
您能否在第一个箭头之前删除该空格?不能少于6个字符。
Faisal Mudhir

7

如何编写基本的PHP三元运算符:

($your_boolean) ? 'This is returned if true' : 'This is returned if false';

例:

$myboolean = true;
echo ($myboolean) ? 'foobar' : "penguin";
foobar

echo (!$myboolean) ? 'foobar' : "penguin";
penguin

一个PHP三元运算符,其中塞满了“ elseif”:

$chow = 3;
echo ($chow == 1) ? "one" : ($chow == 2) ? "two" : "three";
three

但是,请不要嵌套三元运算符,除非会骗人的把戏。这是一种难闻的代码气味。


5

我宁愿将三元if语句与切换用例一起使用。例如:

switch($result->vocation){
case 1:
    echo "Sorcerer";
    break;
case 2:
    echo "Druid";
    break;
case 3:
    echo "Paladin";
    break;
case 4:
    echo "Knight";
    break;
case 5:
    echo "Master Sorcerer";
    break;
case 6:
    echo "Elder Druid";
    break;
case 7:
    echo "Royal Paladin";
    break;
default:
    echo "Elite Knight";
    break;
}

4

您不会:这是混乱且难以阅读。

switch在第一种情况下正在查找该语句。第二个虽然很好,但仍可以转换以保持一致性

三元语句更适合布尔值和交替逻辑。


3

老实说,三元运算符只会使情况变得更糟,如果更简单,我建议您的目标是:

$groups = array(1=>"Player", 2=>"Gamemaster", 3=>"God");
echo($groups[$result->group_id]);

然后是一个类似的职业

$vocations = array(
  1=>"Sorcerer",
  2=>"Druid",
  3=>"Paladin",
  4=>"Knight",
  ....
);
echo($vocations[$result->vocation]);

使用三元运算符,您最终会得到

echo($result->group_id == 1 ? "Player" : ($result->group_id == 2 ? "Gamemaster" : ($result->group_id == 3 ? "God" : "unknown")));

如您所知,添加的越多,它就会变得越复杂


3

除了所有其他答案,您还可以使用switch。但这似乎有点长。

switch ($result->vocation) {
case 1:
    echo 'Sorcerer';
    break;

case 2:
    echo 'Druid';
    break;

case 3:
    echo 'Paladin';
    break;

case 4:
    echo 'Knight';
    break;

case 5:
    echo 'Master Sorcerer';
    break;

case 6:
    echo 'Elder Druid';
    break;

case 7:
    echo 'Royal Paladin';
    break;

default:
    echo 'Elite Knight';
    break;
}

2

您也可以这样做:

echo "yes" ?: "no" // Assuming that yes is a variable that can be false.

代替:

echo (true)  ? "yes" : "no";

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.