【问题标题】:How to replace "if" statement with a ternary operator ( ? : )?如何用三元运算符(?:)替换“if”语句?
【发布时间】: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 的实现也很糟糕。

标签: php conditional-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 添加了参考文献
  • 是吗?在 StackOverflow 的上下文中,它总是一条细线,我的意思是 Q 要求一些东西,但他/她自己无法找到它,然后其他人提供了这个内容。如果复制现有内容有助于此 Q/A 并增加价值,是否不公平?我认为 StackOverflow 上的答案不是“你自己的内容”......嗯
  • 第一个例子不正确。 ) 放错了位置。它应该在? 之前。完整的声明应该是$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 所做的是(或者至少我是这么理解的):

      1. $score &gt; 10?是的
      2. $age &gt; 10?不,所以当前的 $age &gt; 10 ? 'Average' : 'Exceptional' 返回 'Exceptional'
      3. 然后,它不只是停止整个语句并返回“异常”,而是继续评估下一条语句
      4. 下一条语句变为'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;
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2018-10-25
                        • 2017-10-20
                        • 2021-07-09
                        • 1970-01-01
                        • 2012-02-12
                        相关资源
                        最近更新 更多