如何编写带有 elseif 部分的 PHP 三元运算符?
我看到 PHP 三元运算符的
if
和 else
部分的基本示例,如下所示:
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';
}
?>
三元并不是您想要的一个好的解决方案。它在您的代码中将不可读,并且有更好的解决方案可用。
为什么不使用数组查找“地图”或“字典”,如下所示:
$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")));
由于这是一项常见任务,我建议将 switch/case 包装在函数调用中。
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);
echo ($result->vocation == 1) ? 'Sorcerer'
: ($result->vocation == 2) ? 'Druid'
: ($result->vocation == 3) ? 'Paladin'
....
;
有点丑。您应该坚持正常的
if
陈述。
如何编写基本的 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
但是请不要嵌套三元运算符,除非是客厅技巧。这是一种糟糕的代码味道。
我宁愿将三元 if 语句与 switch-case 一起使用。例如:
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;
}
你不会:它很混乱并且难以阅读。
您正在寻找第一种情况中的
switch
语句。第二个很好,但仍然可以转换以保持一致性
三元语句更适合布尔值和交替逻辑。
弃用左关联三元运算符https://wiki.php.net/rfc/ternary_associativity。 PHP 中的三元运算符有一些奇怪的怪癖。此 RFC 添加了针对嵌套三元语句的弃用警告。在 PHP 8 中,此弃用将转换为编译时错误。
1 ? 2 : 3 ? 4 : 5; // deprecated
(1 ? 2 : 3) ? 4 : 5; // ok
来源:https://stitcher.io/blog/new-in-php-74#numeric-literal-separator-rfc
老实说,三元运算符只会让情况变得更糟,如果您的目标是使其更简单,我建议是:
$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")));
正如你所知,添加的越多只会变得更复杂
除了所有其他答案之外,您还可以使用
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;
}
你也可以这样做:
echo "yes" ?: "no" // Assuming that yes is a variable that can be false.
代替:
echo (true) ? "yes" : "no";