我有一个非常长的字符串列表,名为$ 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次?
答案 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
中找到至少一个过滤器。