如何用多个条件写单行if语句?

时间:2017-10-03 06:31:13

标签: php

我目前正在使用嵌套的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;
    }

如果有人可以正确地解释在哪里以及为什么使用哪些代码,那可能真的有助于我和/或其他人。我查看了手册,但我无法弄清楚在哪里使用。

2 个答案:

答案 0 :(得分:1)

没有像&#34;如果简写&#34; 这样的事情。
?:是运营商,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;
}

答案 1 :(得分:0)

您可以使用三元运算符来实现此目的。请查看以下代码:

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

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

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

DEMO使用不同的方法

修改

请注意,此解决方案的可读性低于if-else语句。