如何用三元运算符(?:)替换“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 &gt; 10?是的 是$age &gt; 10?不,所以当前的 $age &gt; 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 替换为&lt;?= code ?&gt; 来缩短此操作

&lt;?=(empty($storeData['street2'])) ? 'Yes &lt;br /&gt;' : 'No &lt;br /&gt;'?&gt;

这很有用,尤其是当您想在导航栏中确定菜单选项是否应显示为已访问(单击)时:

&lt;li&lt;?=($basename=='index.php' ? ' class="active"' : '')?&gt;&gt;&lt;a href="index.php"&gt;Home&lt;/a&gt;&lt;/li&gt;

【讨论】:

在那个 =?> 方法中是否需要 ()?【参考方案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 &lt;br /&gt;' : 'No &lt;br /&gt;';

另一种方式-

$test = ((empty($address['street2'])) ? 'Yes &lt;br /&gt;' : 'No &lt;br /&gt;');

注意- 我在整个表达式中添加了括号以使其更清晰。我以前这样做通常是为了增加可读性。 使用 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”语句?的主要内容,如果未能解决你的问题,请参考以下文章

三元运算

三元运算文件操作

python 三元运算符

python 三元运算

函数式编程(三元运算文件操作)

第三章三元运算文件处理函数