清理很长的 if 语句



我有一个很长的字符串列表,称为 $stringfilter 1 $stringfilter 2 等,一直到 $stringfilter 50

我有另一个字符串$reporteremail,我想做一个条件语句,如果$reporteremail中存在任何$stringfilter字符串,则会执行一些代码。目前我的代码看起来像这样,它可以工作:

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

不过,这非常非常长。我在这里缩短了它。

我想知道是否有一种更清洁、更有效的方法可以做到这一点?

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

$t_filter = plugin_config_get( 'filter1' ); 
$stringfilter1 = string_attribute( $t_filter1 );

我同意遍历数组将是执行此操作的最佳方法。如何将每个新字符串推送到数组的末尾,而不必将该片段写出 50 次?

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

试试这个:

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

我有一个很长的字符串列表,称为 $stringfilter 1 $stringfilter 2 等,一直到 $stringfilter 50

[...]

不过,这非常非常长。我在这里缩短了它。

我想知道是否有一种更清洁、更有效的方法可以做到这一点?

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

$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;
    }
}

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

str_ireplace($filters, '', $reporteremail, $count);
if ($count) {
    // run code
}

$count 参数将包含执行的替换次数的计数。如果它不为零,则在 $reporteremail 中找到至少一个过滤器。

相关内容

  • 没有找到相关文章

最新更新