PHP检测字符串是否包含数组任意元素的代码如何高效简写
原有代码问题说明
- 存在逻辑bug:当
$stringArray不是数组时,strpos($stringArray, $searchInMe)的参数顺序完全颠倒,变成了在黑名单词汇里检索待检测字符串,和需求完全相反 - 大小写匹配逻辑错误:仅将黑名单词汇转小写,待检测字符串没有同步转小写,会导致待检测字符串里的大写内容无法匹配到小写的黑名单词汇
- 存在不必要的重复函数调用:每次循环都调用
strtolower()处理黑名单词汇,重复开销可优化
简写优化版本
public static function includes_from_array($stringArray, $searchInMe, $offset = 0): bool { $lowerTarget = strtolower($searchInMe); foreach ((array)$stringArray as $query) { if ($query !== '' && strpos($lowerTarget, strtolower($query), $offset) !== false) { return true; } } return false; }
优化说明
- 用
(array)强转直接兼容非数组的$stringArray场景,省去单独的分支判断,代码更简洁 - 提前一次性将待检测字符串转小写,仅调用1次
strtolower(),代替原逻辑循环内N次的重复调用,执行效率更高 - 保持短路返回逻辑,只要匹配到第一个黑名单词汇就立刻返回,不会遍历全部黑名单,效率不弱于原有实现
- 修复了原有代码的参数顺序错误、大小写匹配错误的问题,功能正确性更高
- 不建议用
preg_match或者数组高阶函数(比如array_reduce/array_filter)实现,前者需要处理正则特殊字符转义开销,后者无法提前短路返回,遍历全部数组会拉低大数量黑名单下的执行效率
内容的提问来源于stack exchange,提问作者Sinros
相关产品推荐
相关产品推荐

