如何用三元运算符(?:)替换“if”语句?
Posted
技术标签:
【中文标题】如何用三元运算符(?:)替换“if”语句?【英文标题】:How to replace "if" statement with a ternary operator ( ? : )? 【发布时间】:2010-12-03 03:41:36 【问题描述】:基于示例from this page,我想将下面的if
语句转换为三元运算符。
使用if
语句的工作代码:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
我不确定应该如何使用三元运算符来编写它,以便 echo
仅在 street2
存在于数组中且不是空字符串时才有效。
【问题讨论】:
您的问题愚弄了一些志愿者和研究人员,因为您不是使用速记三元表达式(没有“猫王运算符”)编写作业——您正在编写一个速记三元表达式。不同之处在于您根据评估声明了两个返回值。在简写评估中,如果输入值为“真”,则返回;如果它是“falsey”,则返回备用值(这是在 Elvis 运算符之后声明的值)。这里的 Null Coalescing Operator 的实现也很糟糕。 【参考方案1】:(condition) ? /* value to return if condition is true */
: /* value to return if condition is false */ ;
语法不是“速记 if”运算符(?
称为条件运算符),因为您无法以与执行相同的方式执行代码:
if (condition)
/* condition is true, do something like echo */
else
/* condition is false, do something else */
在您的示例中,当$address
不为空时,您正在执行echo
语句。您不能使用条件运算符以相同的方式执行此操作。但是,您可以做的是 echo
条件运算符的结果:
echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];
这将显示“街道是空的!”如果为空,则显示 street2 地址。
【讨论】:
这是语句和表达式的区别 又是什么简写?condition ?: false
如果为真,则计算结果为 condition
?
if 3 条件怎么样?还能用吗?【参考方案2】:
php 7+
从 PHP 7 开始,只需使用 Null coalescing operator 即可执行此任务,如下所示:
echo $address['street2'] ?? 'Empty';
【讨论】:
仅供参考,如果$address['street2']
是一个空字符串。它会接受它并且不会返回'Empty'
。 isset() != empty()
。这仅在值为 null
时有效
如果$address['street2']
不为空,输出是什么?
登录只是为了对这个答案投反对票。这与宣传的完全不符。
这个答案是错误的! 证明:ideone.com/bLJM55 它与!empty($address['street2'])
的结果相呼应,这是真的,PHP 的echo
将把它打印为1
.是的,很奇怪,但就是这样。
empty()
NEVER 返回null
,所以??
永远不会给出想要的结果。当不正确的答案毒害 Stack Overflow 知识库并向研究人员提供可证明不正确的建议时,我绝对讨厌!【参考方案3】:
基本真假声明
$is_admin = ($user['permissions'] == 'admin' ? true : false);
有条件的欢迎信息
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
条件项目消息
echo 'Your cart contains '.$num_items.' item'.($num_items != 1 ? 's' : '').'.';
参考:https://davidwalsh.name/php-ternary-examples
【讨论】:
你是从速记网站得到的,甚至没有引用它 @Richard 添加了参考文献 是吗?在 *** 的上下文中,它总是一条细线,我的意思是 Q 要求一些东西,但他/她自己无法找到它,然后其他人提供了这个内容。如果复制现有内容有助于此 Q/A 并增加价值,是否不公平?我认为 *** 上的答案不是“你自己的内容”......嗯 第一个例子不正确。)
放错了位置。它应该在?
之前。完整的声明应该是$is_admin = ($user['permissions'] == 'admin') ? true : false;
另外,如果不解释示例的作用,完全没用。【参考方案4】:
这是您正在寻找的三元运算符 a.k.a Elvis 运算符(google it :P)。
echo $address['street2'] ?: 'Empty';
如果变量为空,则返回变量的值或默认值。
【讨论】:
@Structed 我不能不同意你所说的,但是,谷歌搜索会给你正确的结果,这是一个更容易提醒的术语 正确答案! 2017 年的另一个赞成的答案不起作用!【参考方案5】:三元运算符只是 if/else 块的简写。你的工作代码没有 else 条件,所以不适合这个。
以下示例将起作用:
echo empty($address['street2']) ? 'empty' : 'not empty';
【讨论】:
【参考方案6】:快捷方式:
echo $address['street2'] ? : "No";
这里有一些有趣的例子,有一个或多个不同的条件。
$color = "blue";
// Example #1 Show color without specifying variable
echo $color ? : "Undefined";
echo "<br>";
// Example #2
echo $color ? $color : "Undefined";
echo "<br>";
// Example #3
echo ($color) ? $color : "Undefined";
echo "<br>";
// Example #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";
// Example #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";
// Example #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";
// Example #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";
PHP 7+ 中的更新
// Check if the value exists
echo $_GET['user'] ?? "Undefined";
// Before isset($_GET['user']) ? $_GET['user'] : 'undefined';
// Multiple conditions can be added
echo $_GET['user'] ?? $_POST['user'] ?? $color ?? 'Undefined';
【讨论】:
【参考方案7】:请注意,在使用嵌套条件运算符时,您可能需要使用括号以避免可能出现的问题!
看起来 PHP 的工作方式至少与 javascript 或 C# 不同。
$score = 15;
$age = 5;
// The following will return "Exceptional"
echo 'Your score is: ' . ($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average'));
// The following will return "Horrible"
echo 'Your score is: ' . ($score > 10 ? $age > 10 ? 'Average' : 'Exceptional' : $age > 10 ? 'Horrible' : 'Average');
Javascript 和 C# 中的相同代码在两种情况下都返回“异常”。
在第二种情况下,PHP 所做的是(或者至少我是这么理解的):
-
是
$score > 10
?是的
是$age > 10
?不,所以当前的 $age > 10 ? 'Average' : 'Exceptional'
返回 'Exceptional'
然后,它不只是停止整个语句并返回“异常”,而是继续评估下一条语句
下一条语句变为'Exceptional' ? 'Horrible' : 'Average'
,它返回“可怕”,因为“异常”是真实的
来自文档:http://php.net/manual/en/language.operators.comparison.php
建议您避免“堆叠”三元表达式。 PHP的 在单个运算符中使用多个三元运算符时的行为 声明不明显。
【讨论】:
【参考方案8】:有条件的欢迎信息
echo 'Welcome '.($user['is_logged_in'] ? $user['first_name'] : 'Guest').'!';
嵌套 PHP 速记
echo 'Your score is: '.($score > 10 ? ($age > 10 ? 'Average' : 'Exceptional') : ($age > 10 ? 'Horrible' : 'Average') );
【讨论】:
【参考方案9】:您可以通过将echo
替换为<?= code ?>
来缩短此操作
<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>
这很有用,尤其是当您想在导航栏中确定菜单选项是否应显示为已访问(单击)时:
<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>
【讨论】:
在那个 =?> 方法中是否需要 ()?【参考方案10】:if else php 速记?
试试这个
($value == 1) ? "selected" : "";
【讨论】:
【参考方案11】:我认为你错误地使用了括号。试试这个:
$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
我觉得应该可以,你也可以用:
echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
【讨论】:
【参考方案12】:还有一个速记三元运算符,看起来像这样:
(expression1) ?: 如果表达式2 的计算结果为真,则返回expression1,否则返回expression2。
例子:
$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';
会回来
Apples are great!
从 PHP 5.3 开始,可以省略中间部分 三元运算符。表达式 expr1 ?: expr3 如果 expr1 返回 expr1 计算结果为 TRUE,否则为 expr3。
来自PHP Manual
【讨论】:
【参考方案13】:我认为你可能不应该在 php 中使用三元运算符。 考虑下一个例子:
<?php
function f1($n)
var_dump("first funct");
return $n == 1;
function f2($n)
var_dump("second funct");
return $n == 2;
$foo = 1;
$a = (f1($foo)) ? "uno" : (f2($foo)) ? "dos" : "tres";
print($a);
你觉得$a
变量会包含什么? (提示:dos)
即使将$foo
变量分配给2,它也将保持不变。
为了使事情变得更好,您应该拒绝使用此运算符,或者按以下方式用大括号将右侧部分括起来:
$a = (f1($foo)) ? "uno" : ((f2($foo)) ? "dos" : "tres");
【讨论】:
【参考方案14】:三元运算符基本上是 if/else 语句的简写。我们可以使用它来减少几行代码并增加可读性。
您的代码对我来说看起来更干净。但是我们可以添加更清洁的方式如下-
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
另一种方式-
$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');
注意- 我在整个表达式中添加了括号以使其更清晰。我以前这样做通常是为了增加可读性。 使用 PHP7,我们可以使用Null Coalescing Operator / php 7 ?? operator 来获得更好的方法。但是不符合你的要求。
【讨论】:
【参考方案15】:我认为我在上述所有解决方案中都找不到答案。
有些也是错误的。
要测试变量(或数组的元素,或对象的属性)是否存在(并且不为空),请使用:
echo isset($address['street2']) ? $address['street2'] : 'Empty';
要测试变量 (...) 是否包含一些非空数据,请使用:echo !empty($address['street2']) ? $address['street2'] : 'Empty';
【讨论】:
【参考方案16】:如果第一个变量($a
)是null
,则将第二个变量($b
)的值赋给第一个变量($a
)
$a = 5;
$b = 10;
$a != ''?$a: $a = $b;
echo $a;
【讨论】:
以上是关于如何用三元运算符(?:)替换“if”语句?的主要内容,如果未能解决你的问题,请参考以下文章