2015-12-07 4 views
0

Я создаю php-фильтр для своей веб-страницы, который проверяет массив, читает через файл, чтобы увидеть, содержит ли несколько полей ввода пользователя (имя, описание и т. Д.) Какое-либо из слов в массиве. Я попытался использовать функцию «strpos», встроенную в php, но по какой-то причине он обнаружил только слово, если слово было последним в строке, т. Е. Если бы я проверял слово «cat», он обнаружил бы это, если бы это было проверяя «это кошка» и «скат», но не проверяли «кошек» или «игрушку с кошками» или даже просто «кошку» с пробелом после нее. Чтобы быть ясным, я проверил, не была ли функция strpos не равна false (strpos (...)! == false). Поэтому я создал свою собственную функцию, которая разбивает строку на каждую возможную подстроку и проверяет каждую из них, чтобы убедиться, что она равна любому из слов в массиве. Есть ли более быстрый способ, которым я мог бы это сделать, или способ ускорить выполнение этого кода? Вот код:Как я могу ускорить эту функцию PHP?

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; 
} 
+0

Возможно, вы могли бы пойти другим путем и использовать 'in_array()' – developerwjk

+0

Я просто попробовал это, и он экспоненциально быстрее. Спасибо огромное! – carsond2704

+0

Не могли бы вы рассказать о проблеме strpos? У меня такое чувство, что вы не различаете функцию, возвращающую 0, и логическое значение false. Если вы ищете «кошку» в «кошках» или «кошках» с пробелом, она вернет 0, потому что счетные множества начинаются с нуля, а не 1. Если вы просто делаете «if (strpos()) {condition true} «0 отбрасывается на false, так что это не сработает. Вам нужна строгая проверка равенства, то есть «if strpos (...)! == false ...» –

ответ

1

Я подозреваю, что вы, возможно, были злоупотребления 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) 
0

Этот ответ, предложенный @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; }

Смежные вопросы