清理一个很长的if语句

时间:2017-05-23 15:28:12

标签: php if-statement stripos

我有一个非常长的字符串列表,名为$ stringfilter1 $ stringfilter2等,一直到$ stringfilter50

我有另一个字符串$ reporteremail,我想创建一个条件语句,如果$ reporteremail中存在任何$ stringfilter字符串,则会执行一些代码。目前我的代码看起来像这样,并且有效:

if (stripos($reporteremail, $stringfilter1) !== false || stripos($reporteremail, $stringfilter2) !== false || stripos($reporteremail, $stringfilter3) !== false [...]) {
       runcode(); 
}

这是非常漫长的。我在这里剪短了。

我想知道是否有更清洁,更有效的方法来做到这一点?

编辑: 我正在为bug跟踪器编写插件。字符串在文本框中的另一页上输入。我通过运行看起来像

的函数在此页面上访问它们
$t_filter = plugin_config_get( 'filter1' ); 
$stringfilter1 = string_attribute( $t_filter1 );

我同意循环数组将是最好的方法。如何将每个新字符串推送到数组的末尾,而不必将上面的代码段写入50次?

2 个答案:

答案 0 :(得分:3)

  

如何将每个新字符串推送到数组的末尾,而不必将上面的代码段写出50次?

试试这个:

$needles = [];
for ($i = 0; $i < 50; $i++) {
    $t_filter = plugin_config_get("filter$i"); 
    $needles[] = string_attribute($t_filter);
}
  

我有一个非常长的字符串列表,名为$ stringfilter1 $ stringfilter2等,一直到$ stringfilter50

     

[...]

     

这是非常漫长的。我在这里剪短了。

     

我想知道是否有更清洁,更有效的方法来做到这一点?

试试这个,它应该在上面的代码块之后。

$flag = false;
foreach ($needles as $needle) {
    if (stripos($reporteremail, $needle) !== false) {
        $flag = true;
        break;
    }
}

if ($flag) {
    runcode();
}

上面的代码通过迭代$needles数组来工作,如果stripos没有返回false,则设置一个标志。在完成迭代后,它会检查标志是否为真,如果是,这意味着在阵列中找到了一个针。


修改 或者,您可以在一个循环中完成所有操作,这样更快,更高效。

$flag = false;
for ($i = 0; $i < 50; $i++) {
    $t_filter = plugin_config_get("filter$i"); 
    $needle   = string_attribute($t_filter);
    if (stripos($reporteremail, $needle) !== false) {
        // One of the needles was found in $reporteremail.
        runcode();
        break;
    }
}

答案 1 :(得分:1)

你不需要循环。首先将所有过滤器放在一个数组中,而不是将它们放在单独的变量中。我会尝试通过修改输入源而不是在PHP脚本中执行此操作来执行此操作。 (根据你的评论,我不确定这是否可能,所以也许你需要一个类似于另一个答案中的循环。)然后你可以使用{ {1}}检查str_ireplace中的过滤字符串。 (这不会修改$reporteremail。)

$reporteremail

str_ireplace($filters, '', $reporteremail, $count); if ($count) { // run code } 参数将包含已执行的替换次数的计数。如果它非零,则在$count中找到至少一个过滤器。