如何在PHP中使用三元运算符(?:)作为“ if / else”的简写?


118

根据此页面上的示例,我在下面有工作和非工作代码示例。

工作代码使用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 />';

更新
在Brian提出技巧之后,我发现echo $test输出了预期的结果。以下作品令人着迷!

echo (empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />';

4
看起来很正确。您是否尝试回显$ test ;?
布赖恩·费舍尔

您的问题是在欺骗一些志愿者和研究人员,因为您不是在使用速记三元表达式编写作业(没有“ Elvis Operator”),而是在编写速记三元表达式。不同之处在于,您要根据评估声明两个返回值。在速记评估中,如果输入值“真实”,则将其返回;如果为“ falsey”,则返回后备值(这是在Elvis操作员之后声明的值)。这里的Null合并运算符的实现也很差。
mickmackusa

Answers:


234

(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 */
}

在您的示例中,您echo$address不为空时执行语句。对于条件运算符,您不能以相同的方式进行操作。但是,您可以做echo的是条件运算符的结果:

echo empty($address['street2']) ? "Street2 is empty!" : $address['street2'];

并显示“街道为空!” 如果为空,则将显示street2地址。


陈述和表达之间的区别
pmiranda

2
速记又是什么?condition ?: false哪个评估其condition是否正确?
oldboy

43

PHP 7+

从PHP 7开始,可以简单地通过使用Null合并运算符来执行此任务,如下所示:

echo !empty($address['street2']) ?? 'Empty';


3
仅供参考,如果$address['street2']是空字符串。它将接受并且不会返回'Empty'isset() != empty()。仅当值是null
AFwcxx '18

好吧,我只是提供一个例子。但是我修改了代码。谢谢 !
拉宾喇嘛洞

2
如果$address['street2']不为空,输出是什么?
AliN11

如果$ address ['street2']不为空,则将输出某种形式的“ true”。上面的通常形式更像是:echo $address['street2'] ?? 'Empty';但是,如上所述,它是“ 合并运算符”,因此它仅测试空而不是空。这是因为 ??实际上是isset()的简写。
布莱恩C

1
登录只是为了投票否决这个答案。这根本不做广告。
TKoL

28

基本的对/错声明

$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


2
您是从速记网站上获得的,甚至都没有引用
理查德(Richard)

1
@Richard添加了参考
Arun Yokesh '19

是吗 ?在StackOverflow的上下文中,这总是一条细线,我的意思是Q要求某项内容,但他/她自己找不到,然后其他人提供了此内容。如果复制现有内容有帮助并增加此问答的价值,是否不公平?我认为,在计算器上的答案是不是“自己的内容” ...嗯
SLIQ

第一个例子是不正确的。将)是错误的。应该在之前?。完整的陈述应为$is_admin = ($user['permissions'] == 'admin') ? true : false;
1934286

12

三元运算符只是if和else / else块的简写。您的工作代码没有其他条件,因此不适合此条件。

以下示例将起作用:

echo empty($address['street2']) ? 'empty' : 'not empty';

6

您正在寻找的是三元运算符,也就是猫王运算符(google:P)。

echo $address['street2'] ?: 'Empty'; 

它返回变量的值;如果变量为空,则返回默认值。


@Structed我不能不同意您说的话,但是,使用谷歌搜索将为您提供适当的结果,并且提醒您一个更简单的术语
Keyboard ninja

4

请注意,在使用嵌套条件运算符时,您可能需要使用括号来避免可能的问题!

看来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的作用是(或者至少是我所了解的):

  1. $score > 10?是
  2. $age > 10?不,因此当前$age > 10 ? 'Average' : 'Exceptional'返回“ Exceptional”
  3. 然后,它不仅停止整个语句并返回“ Exceptional”,而且继续评估下一条语句
  4. 'Exceptional' ? 'Horrible' : 'Average'一条语句返回“ Horrible”,因为“ Exceptional”是真实的

从文档中:http : //php.net/manual/zh/language.operators.comparison.php

建议您避免“堆叠”三元表达式。在单个语句中使用多个三元运算符时,PHP的行为并不明显。


3

快捷方式:

echo $address['street2'] ? : "No";

这是一些有趣的示例,它们具有一个或多个不同的条件。

$color = "blue";

// Condition #1 Show color without specifying variable 
echo $color ? : "Undefined";
echo "<br>";

// Condition #2
echo $color ? $color : "Undefined";
echo "<br>";

// Condition #3
echo ($color) ? $color : "Undefined";
echo "<br>";

// Condition #4
echo ($color == "blue") ? $color : "Undefined";
echo "<br>";

// Condition #5
echo ($color == "" ? $color : ($color == "blue" ? $color : "Undefined"));
echo "<br>";

// Condition #6
echo ($color == "blue" ? $color : ($color == "" ? $color : ($color == "" ? $color : "Undefined")));
echo "<br>";

// Condition #7
echo ($color != "") ? ($color != "" ? ($color == "blue" ? $color : "Undefined") : "Undefined") : "Undefined";
echo "<br>";

2

有条件的欢迎消息

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') );

2

您可以将其替换echo为更短的时间<?= code ?>

<?=(empty($storeData['street2'])) ? 'Yes <br />' : 'No <br />'?>

这在您要在导航栏内确定菜单选项是否应显示为已访问(单击)时特别有用:

<li<?=($basename=='index.php' ? ' class="active"' : '')?>><a href="index.php">Home</a></li>


该<?=?>方法中是否需要()?
卷曲

0

我认为您使用括号的方式是错误的。试试这个:

$test = (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

我认为应该可以,您也可以使用:

echo (empty($address['street2']) ? 'Yes <br />' : 'No <br />');

0

我认为您可能不应该在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");

0

三元运算符基本上是if / else语句的缩写。我们可以用来减少几行代码并提高可读性。

您的代码对我来说看起来更干净。但是我们可以添加更简洁的方法,如下所示:

$test = (empty($address['street2'])) ? 'Yes <br />' : 'No <br />';

其他方式-

$test = ((empty($address['street2'])) ? 'Yes <br />' : 'No <br />');

注意-我在整个表达式中添加了括号,以使其更清晰。我通常这样做是为了增加可读性。使用PHP7,我们可以使用Null合并运算符/ php 7?操作员,以获得更好的方法。但是您的要求不适合。


-1

还有一个速记三元运算符,它看起来像这样:

(表达式1):表达式2将返回表达式,如果计算结果为true或表达式2,否则。

例:

$a = 'Apples';
echo ($a ?: 'Oranges') . ' are great!';

将返回

Apples are great!

从PHP 5.3开始,可以省略三元运算符的中间部分。如果expr1的计算结果为TRUE,则表达式expr1?:expr3返回expr1,否则返回expr3。

PHP手册

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.