如何使用三元运算符 ( ?:) 在 PHP 中作为“if / else”的简写?
-
19-09-2019 - |
题
基于示例 从这个页面, ,我有下面的工作和非工作代码示例。
工作代码使用 if
陈述:
if (!empty($address['street2'])) echo $address['street2'].'<br />';
使用三元运算符的非工作代码:
$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
// Also tested this
(empty($address['street2'])) ? 'Yes <br />' : 'No <br />';
更新
在布莱恩的提示之后,我发现回响 $test
输出预期结果。下面的作品就像一个魅力!
echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';
解决方案
在
(condition) ? /* value to return if condition is true */
: /* value to return if condition is false */ ;
语法是不是一个“的简写,如果”操作员(?
被称为条件运算),因为不能以相同的方式执行代码,如果你没有:
if (condition) {
/* condition is true, do something like echo */
}
else {
/* condition is false, do something else */
}
在你的榜样,您正在执行的echo
语句时$address
不是空的。你不能这样做的条件操作方式相同。然而,什么可以做,是echo
条件运算符的结果:
echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];
这将显示“街是空的!”如果是空的,否则它会显示STREET2地址。
其他提示
<强>基本真/假声明强>
$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' : '').'.';
三元运算符仅仅是,如果/ else块的简写。你的工作代码不具有其他条件,所以是不适合的。
下面的例子将工作:
echo empty($address['street2']) ? 'empty' : 'not empty';
这是三元操作符a.k.a Elvis操作符(google一下:P),你正在寻找。
echo $address['street2'] ?: 'Empty';
它如果变量为空,则返回变量或默认的值。
注意 使用嵌套条件运算符时,您可能需要使用括号 以避免可能出现的问题!
看起来 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# 中的相同代码在两种情况下都返回“Exceptional”。
在第二种情况下,PHP 的作用是(或者至少我是这么理解的):
- 是
$score > 10
?是的 - 是
$age > 10
?不,所以当前$age > 10 ? 'Average' : 'Exceptional'
返回“异常” - 然后,它不只是停止整个语句并返回“Exceptional”,而是继续评估下一个语句
- 下一条语句变为
'Exceptional' ? 'Horrible' : 'Average'
返回“Horrible”,因为“Exceptional”是真的
从文档中: http://php.net/manual/en/language.operators.comparison.php
建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时,PHP的行为并非很明显。
<强>条件欢迎辞强>
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') );
可以通过替换与echo
<?= code ?>
为此甚至更短的
<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>
特别是当你要确定,一个导航栏里面,无论是已经访问过的菜单选项应显示这是有用的(点击)或不:
<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>
下面是一些有趣的例子,与一个或多个不同条件。
$value1 = '1';
$value2 = '2';
$value3 = '3';
// 1 Condition
$v1 = ($value1 == '1') ? TRUE : FALSE;
var_dump($v1);
echo "<br>";
// 2 Conditions
$v2 = ($value1 == '' ? TRUE : ($value2 == '2' ? TRUE : FALSE));
var_dump($v2);
echo "<br>";
// 3 Conditions
$v3 = ($value1 == '' ? TRUE : ($value2 == '' ? TRUE : ($value3 == '3' ? TRUE : FALSE)));
var_dump($v3);
echo "<br>";
// 4 Conditions
$v4 = ($value1 == '1') ? ($value2 == '2' ? ($value3 == '3' ? TRUE : 'FALSE V3') : 'FALSE V2') : 'FALSE V1' ;
var_dump($v4);
echo "<br>";
我觉得你用括号内的错误的方式。尝试这样:
$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
我觉得它应该工作,你也可以使用:
echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');
还有一个简写三元运算符,如下所示:
(表达式1) ?:表达式2将返回 表达式1 如果它评估为 true 或 表达式2 否则。
例子:
$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';
将返回
Apples are great!
自PHP 5.3以来,可以忽略三元操作员的中部。表达式 expr1 ?:如果expr1评估为true,则expr3返回expr1,否则expr3。
来自 PHP手册