Я делаю php-фильтр для моей веб-страницы, который проверяет массив, читает файл, чтобы увидеть, содержит ли несколько полей ввода пользователя (имя, описание и т. Д.) Какие-либо слова из массива. Я попытался использовать функцию «strpos», встроенную в php, но по какой-то причине он обнаружил слово только в том случае, если слово было последним в строке, т. Е. Если бы я проверял слово «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;
}
Я подозреваю, что вы могли злоупотреблять strpos()
; либо помещая аргументы в неправильном порядке, либо не проверяя истинный логический результат. Это должно работать:
function foundInArray($string, $array){
$string = strtolower($string);
foreach($array as $check){
if (strpos($string, strtolower($check)) !== false) {
return true;
}
}
return false;
}
Изменить, чтобы добавить результаты:
php > $array = ["foo", "bar", "baz"];
php > $string = "Cheese is a food I like";
php > var_dump(foundInArray($string, $array));
bool(true)
php > $string = "Cheese is a thing I like";
php > var_dump(foundInArray($string, $array));
bool(false)
Этот ответ, предложенный @developerwjk, помог решить мою проблему. Я все еще открыт для большего количества предложений, хотя, если они есть.
function arrayContains($string, array $array){
$string = strtolower($string);
$len=strlen($string);
for($i=0; $i<$len; $i++){
for($j=1; $j<=$len-$i; $j++){
$sub=substr($string,$i,$j);
if(in_array($sub, $array))
return true;
}
}
return false;
}