【问题标题】:how to write single line if statement with multiple conditions?如何编写具有多个条件的单行 if 语句?
【发布时间】:2017-10-03 06:31:13
【问题描述】:

我目前正在处理带有嵌套 if 语句的 foreach 循环,但我很确定有更好的方法来编写这些 if 语句块。
我找到了这篇文章:PHP if shorthand and echo in one line - possible?
虽然这篇文章是针对单一条件的,但我想以同样的方式写我的文章(单行)。

我自己在 PHP 方面的经验并不多,所以我有点坚持使用老式的方式:

   if(($colorLevel['name'] === 'ATTR_VPMCV13') && ($colorLevel['level'] >= 80))
    {
        $prominentSideNumberArray[] = 10;
    }

   elseif(($colorLevel['name'] == 'ATTR_VPMCV13') && ($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)){
        $prominentSideNumberArray[] = 8;
    }

如果有人能正确解释在何处以及为什么使用什么代码,那真的可以帮助我和/或其他人。我看过手册,但我就是不知道在哪里使用什么。

【问题讨论】:

  • 只是一点点评论与您的​​问题无关,但在比较某些内容时不要使用像“ATTR_VPMCV13”这样的字符串。我不知道你从哪里得到这个值,但是如果你要更改数据库中的某些内容,你将不得不对所有这些字符串进行硬编码,而不是将其作为 1 个变量。
  • @Tomm,或者您可以将其定义为单个位置的常量。
  • 还有一条评论,它是公司使用的碳粉的名称。它很难编程到多个应用程序中。
  • @KIKOSoftware 我还没有考虑过,谢谢!
  • 这基本上就是我解释的内容,无论你如何获得价值,都要确保定义它。

标签: php


【解决方案1】:

没有像 "if shorthand" 这样的东西。
?: 是运算符,ifcontrol structure。它们是不同的语言概念,具有不同的目的并做不同的事情。包含三元条件运算符 (?:) 的表达式始终可以重写为两个表达式和一个 if/else statement。反之亦然。


如果您将$colorLevel['name'] 的通用检查提取到包含其余测试的单独if 中,您发布的代码可以编写得更容易阅读,将$colorLevel['level'] 提取到一个更短的新变量中命名并使使用$colorLevel['level'] 的条件使用相同的规则:

$level = $colorLevel['level'];
if ($colorLevel['name'] == 'ATTR_VPMCV13') {
    // Don't mix '<=' with '>=', always use '<='...
    if (60 <= $level && $level <= 70) {
        $prominentSideNumberArray[] = 8;
    // ... and put the intervals in ascending order
    } elseif (80 <= $level) {
        $prominentSideNumberArray[] = 10;
    }
}

如果有多个if 语句验证$colorLevel['name'] 的不同值,那么使用switch statement 的意图会更清楚:

$level = $colorLevel['level'];
switch ($colorLevel['name'])
{
    case 'ATTR_VPMCV13':
        if (60 <= $level && $level <= 70) {
            $prominentSideNumberArray[] = 8;
        } elseif (80 <= $level) {
            $prominentSideNumberArray[] = 10;
        }
        break;

    case '...':
        // ...
        break;

    default:
        // ...
        break;
}

【讨论】:

    【解决方案2】:

    您可以通过使用三元运算符来实现这一点。看下面的代码:

    $prominentSideNumberArray[] = ((($colorLevel['name'] === 'ATTR_VPMCV13') &&
     ($colorLevel['level'] >= 80) )? 10 : (($colorLevel['name'] == 'ATTR_VPMCV13') && 
    ($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)?8:""))  ;
    

    编辑根据 cmets,您必须比较相同的值才能更好地定义名称

    $color_name = "ATTR_VPMCV13";
    if($colorLevel['name'] == $color_name )
        $prominentSideNumberArray[] = (($colorLevel['level'] >= 80)? 10 : (
    ($colorLevel['level'] >= 60) && ($colorLevel['level'] <= 70)?8:""))  ;
    

    DEMO 采用不同的方法

    编辑

    请记住,此解决方案的可读性不如 if-else 语句。

    【讨论】:

    • 虽然这是 op 要求的,但在我看来,这比原来的 if-elseif 语句可读性差。我肯定会坚持使用 if-elseif
    • 很好的答案,如果@Dannylycka 将 'ATTR_VPMCV13' 定义为某个变量,那就更好了。而且更安全
    • 确实不错的答案!我一定会在某处声明碳粉以改进我的代码!
    • 你能不能也解释一下你写的东西?例如,为什么最后有一个“”?因为它不会关闭任何东西或声明任何东西。
    • 我也同意只有在不能添加 if 块或者条件很简单的情况下才应该使用此运算符。为什么?正如其他人所说,一个是可读性,想象一下稍后添加更多条件,看看beautiful 的外观。它变得难以跟踪、更容易出错、没有格式等等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2014-10-20
    • 2021-10-08
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多