PHP和嵌套条件

时间:2019-03-04 20:29:18

标签: php nested conditional-statements

在PHP中(甚至在其他语言中,但在当前情况下,这在PHP中更多),有时我常常不得不编写一些较长的条件,例如以下示例:

我有一个包含许多条件的代码,我想根据某些条件显示不同的结果。

  • 如果某物是红色,而另一物是红色,则打印X,
  • 如果某物是红色但另一物是黑色,则打印Y
  • 如果某物是红色,而另一物是红色,但第三件是蓝色,则打印X
  • &等等

是否可以通过使用某种数据结构/配置数组/矩阵/任何内容来正确处理此问题?也就是说,将这些“条件”和“结果”正确存储在某种配置数组或其他配置数组中?

无需编写嵌套条件,以后很难支持 像这个很小的例子,但规模更大

if (preg_match(/something/, $string) {
  $result = 'GREEN';
} elseif (preg_match(/something/, $string) {
  $result = 'RED';
} else {
  if (something else) {
    $result = 'GREEN';
  } else {
    if (something OR something) {
       $result = 'AMBER';
    } else {
       $result = 'GREEN';
    }
  }
}

还是处理此问题的唯一方法? 也许只有一个

if (something and something or something) {

} elseif (something and something and something) {

} elseif (something and something or something and something) {

} etc

感谢您的帮助

我正在编写一个应用程序,该应用程序应根据许多不同的数据(该数据的其他属性)为某些数据显示不同的“状态”,并且我希望避免代码不可读

3 个答案:

答案 0 :(得分:2)

出于以下答案的目的,我假设您正在编码OO PHP

一个变量

当我有一个确定结果的一个变量时,如果该变量是布尔值或接近于布尔值(意味着它只能是一个或两个不同的值),则应使用{{ 1}}语句,就像您一样。如果变量可以是各种(已知)值(例如您的颜色示例),则可以使用switch()函数。

两个或多个变量

如果我有两个变量来确定结果,例如颜色和大小,则我首先使用switch(),然后对于每个开关,我都使用包含另一个switch()的方法。

它可能更冗长,但从长远来看,要跟踪它要容易得多。下面是该逻辑的简化示例。

if()

答案 1 :(得分:2)

您可以使用嵌套数组:

$conditions = [
    '/something1/' => [
        '/something2/' => "X"
    ],
    'thing3' => [
        '/thing3/' => 'Y',
        '/thing4/' => 'Z'
    ]
];
$matched = false;
foreach ($conditions as $key1 => $val1) {
    if (preg_match($key1, $string)) {
        if (is_array($val1)) {
            foreach ($val1 as $key2 => $val2) {
                if (preg_match($key2, $string)) {
                    $result = $val2;
                    $matched = true;
                    break;
                }
            }
        } else {
            $result = $val1;
            $matched = true;
        }
    }
    if ($matched) {
        break;
    }
}
if (!$matched) {
    $result = 'default';
}

要允许任意级别的嵌套,您可以将其转换为递归函数。

答案 2 :(得分:1)

与@dearsina相似,我倾向于将其分离为此类事情的函数,例如,如果您知道在很多情况下它可以返回相同的值,例如:

if(isGreen($string)) return 'GREEN';
else if (isRed($string)) return 'RED';

function isGreen($string) {
    if(cond1)return true;
    if(cond2 && cond3)return true;
    if(cond4 || cond 5)return true;
    return false;
}

function isRed($string) {
    if(cond6)return true;
    if(cond1 && cond7)return true;
    if(cond2 || cond 8)return true;
    return false;
}

我们有时会使用您建议的样式...

if (something and something or something) {

} else if (something and something and something) {

但是您很快就会遇到同样的可读性和维护问题