【发布时间】:2016-03-12 13:45:01
【问题描述】:
我正在为我的网页制作一个 php 过滤器,该过滤器检查一个数组,读取一个文件,以查看多个用户输入字段(名称、描述等)是否包含数组中的任何单词。我尝试使用 php 内置的“strpos”函数,但无论出于何种原因,它只检测到该词是否是字符串中的最后一个词,即如果我正在检查“cat”这个词,它会检测到它是否是检查“this is a cat”和“scat”,但不检查“cats”或“cat toy”,甚至只是“cat”后面有一个空格。为了清楚起见,我确实检查了 strpos 函数是否不等于 false (strpos(...)!==false)。所以我创建了自己的函数,将字符串分解为每个可能的子字符串,并检查每个子字符串是否等于数组中的任何单词。有没有更快的方法可以做到这一点,或者我可以加快代码的执行速度?代码如下:
function arrayContains($string, array $array){
$string = strtolower($string);
$len=strlen($string);
foreach($array as $check){
for($i=0; $i<$len; $i++){
for($j=1; $j<=$len-$i; $j++){
$sub=substr($string,$i,$j);
if($sub==$check)
return true;
}
}
}
return false;
}
【问题讨论】:
-
也许你可以反过来使用
in_array() -
我刚刚尝试过,它的速度呈指数级增长。非常感谢!
-
能否请您详细说明一下strpos问题?我有一种感觉,您没有区分返回 0 和布尔值 false 的函数。如果您在“cats”或“cats”中搜索“cat”并带有空格,它将返回 0,因为可数集从位置 0 开始,而不是 1。如果您只是在执行“if (strpos()) { condition true } " 0 被强制转换为 false,所以它不起作用。您需要严格的相等性检查,即“if strpos(...) !== false...”
-
@carsond2704 - 如果您找到了解决方案,可以将其添加为您自己问题的答案
-
@KaloyanDoichinov 我的 if 语句说“if (strpos(...)!==false)”
标签: php string function loops contains