1

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

我有另一个字符串 $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 次以上?

4

2 回答 2

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;
    }
}
于 2017-05-23T15:50:28.980 回答
1

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

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

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

于 2017-05-23T15:48:20.570 回答