在PHP中(甚至在其他语言中,但在当前情况下,这在PHP中更多),有时我常常不得不编写一些较长的条件,例如以下示例:
我有一个包含许多条件的代码,我想根据某些条件显示不同的结果。
是否可以通过使用某种数据结构/配置数组/矩阵/任何内容来正确处理此问题?也就是说,将这些“条件”和“结果”正确存储在某种配置数组或其他配置数组中?
无需编写嵌套条件,以后很难支持 像这个很小的例子,但规模更大
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
感谢您的帮助
我正在编写一个应用程序,该应用程序应根据许多不同的数据(该数据的其他属性)为某些数据显示不同的“状态”,并且我希望避免代码不可读
答案 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) {
但是您很快就会遇到同样的可读性和维护问题