比嵌套if-else更好的解决方案?

时间:2011-09-12 03:00:37

标签: php coding-style if-statement

不确定这是如何用更好的标题来描述的,但是这是我的问题:

我有一个带有多个布尔选项的替换函数:

  1. 正则表达式
  2. 整个单词(仅当正则表达式== false时)
  3. 区分大小写
  4. 这意味着我必须选择4种方法之一来替换我的文字。目前我的代码如下所示:

    (这里的选项确实是true / false作为字符串,通过POST从一组jquery checkboxes传入)

        if($regex=='true')
        {
            if($casesens=='true')
            {
                $p->aData['body'] = preg_replace('/'.$q.'/', $r, $p->aData['body']);
            }
            else
            {
                $p->aData['body'] = preg_replace('/'.$q.'/i', $r, $p->aData['body']);           
            }
        }
        else
        {
            if($wwords=='true')
            {
                $q = " ".$q." ";
                $r = " ".$r." ";
            }
            if($casesens=='true')
            {
                $p->aData['body'] = str_replace($q, $r, $p->aData['body']);
            }
            else
            {
                $p->aData['body'] = str_ireplace($q, $r, $p->aData['body']);
            }
        }
    

    正如您所看到的,如果必须在两个条件中比较$casesens,如果我必须向UI添加更多选项,这将变得越来越复杂。 是否有更好或更优雅的方式来写这个?

3 个答案:

答案 0 :(得分:2)

你可以通过减少大量不必要的重复来简化你所拥有的东西,例如:

if(!$regex) $q = preg_quote($q);
elseif($words) $q = "\s{$q}\s/";
$q = "/{$q}/";
if($casesens) $q .= 'i';
$p->aData['body'] = preg_replace($q, $r, $p->aData['body']);

我不会称之为优雅,但至少它更短。

答案 1 :(得分:1)

您只需检查一次$casesens并定义一个如下变量:

if($casesens=='true') {
    $case = 'i';
}

然后在正则表达式模式中使用它,就像任何其他变量一样:

$p->aData['body'] = preg_replace('/'.$q.'/'.$case, $r, $p->aData['body']);

这将解决第一个if。至于第二个,我可以想到两种方式:

  1. 创建一个类似于str_replacestri_replace的函数,它接受一个额外的布尔参数,忽略大小写,并调用相应的字符串替换函数。
  2. 您可以像以前一样使用preg_replace代替字符串替换函数,并使用相同的方法解决问题,如上所述。

答案 2 :(得分:0)

您可以使用PHP三元运算符来降低复杂性

http://davidwalsh.name/php-shorthand-if-else-ternary-operators