Использование массива в виде игл в strpos

Как вы используете strpos для массива игл при поиске строки? Например:

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; if(strpos($string, $find_letters) !== false) { echo 'All the letters are found in the string!'; } 

Потому что, когда вы используете это, это не сработает, было бы хорошо, если бы что-то вроде этого

Related of "Использование массива в виде игл в strpos"

@Добавить обновленный фрагмент из http://www.php.net/manual/en/function.strpos.php#107351

 function strposa($haystack, $needles=array(), $offset=0) { $chr = array(); foreach($needles as $needle) { $res = strpos($haystack, $needle, $offset); if ($res !== false) $chr[$needle] = $res; } if(empty($chr)) return false; return min($chr); } 

Как использовать:

 $string = 'Whis string contains word "cheese" and "tea".'; $array = array('burger', 'melon', 'cheese', 'milk'); if (strposa($string, $array, 1)) { echo 'true'; } else { echo 'false'; } 

вернет true из-за array "cheese" .

Обновление: улучшенный код с остановкой, когда найдена первая из игл:

 function strposa($haystack, $needle, $offset=0) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $query) { if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result } return false; } $string = 'Whis string contains word "cheese" and "tea".'; $array = array('burger', 'melon', 'cheese', 'milk'); var_dump(strposa($string, $array)); // will return true, since "cheese" has been found 

В приведенном ниже коде не только показано, как это сделать, но и помещается в простую в использовании функцию, перемещающуюся вперед. Это было написано «jesda». (Я нашел его онлайн)

Код PHP:

 <?php /* strpos that takes an array of values to match against a string * note the stupid argument order (to match strpos) */ function strpos_arr($haystack, $needle) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $what) { if(($pos = strpos($haystack, $what))!==false) return $pos; } return false; } ?> 

Применение:

 $needle = array('something','nothing'); $haystack = "This is something"; echo strpos_arr($haystack, $needle); // Will echo True $haystack = "This isn't anything"; echo strpos_arr($haystack, $needle); // Will echo False 

Вы можете выполнить итерацию по массиву и установить значение «флаг», если strpos возвращает false .

 $flag = false; foreach ($find_letters as $letter) { if (strpos($string, $letter) === false) { $flag = true; } } 

Затем проверьте значение $flag .

str_replace значительно быстрее.

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; $match = (str_replace($find_letters, '', $string) != $string); 

Если вы просто хотите проверить, действительно ли определенные символы в строке или нет, используйте strtok :

 $string = 'abcdefg'; if (strtok($string, 'acd') === $string) { // not found } else { // found } 

Это выражение ищет все буквы:

 count(array_filter( array_map("strpos", array_fill(0, count($letters), $str), $letters), "is_int")) == count($letters) 

Вопрос, является ли приведенный пример просто «примером» или точным тем, что вы ищете? Здесь много смешанных ответов, и я не понимаю сложность принятого.

Чтобы узнать, существует ли в строке ЛЮБОЕ содержание массива игл и быстро возвращать true или false:

 $string = 'abcdefg'; if(str_replace(array('a', 'c', 'd'), '', $string) != $string){ echo 'at least one of the needles where found'; }; 

Если, так, пожалуйста, дайте @Leon кредит для этого.

Чтобы узнать, существуют ли в строке ВСЕ значения массива игл , так как в этом случае все три 'a', 'b' и 'c' ДОЛЖНЫ присутствовать, как вы упоминаете как ваш «пример»,

echo 'Все буквы найдены в строке!';

Многие ответы здесь не из этого контекста, но я сомневаюсь в том, что вопрос о том, как вы отметили, разрешен. Например, принятый ответ – это игла

 $array = array('burger', 'melon', 'cheese', 'milk'); 

Что делать, если все эти слова ДОЛЖНЫ быть найдены в строке?

Затем вы попробуете некоторые "not accepted answers" на этой странице.

Со следующим кодом:

 $flag = true; foreach($find_letters as $letter) if(false===strpos($string, $letter)) { $flag = false; break; } 

Затем проверьте значение $flag . Если это true , все буквы были найдены. Если нет, это false .

Вы можете попробовать следующее:

 function in_array_strpos($word, $array){ foreach($array as $a){ if (strpos($word,$a) !== false) { return true; } } return false; } 

Я пишу новый ответ, который, надеюсь, поможет любому, кто ищет то, что я есть.

Это работает в случае «У меня несколько иголок, и я пытаюсь использовать их для поиска выделенной строки». и это вопрос, который я нашел, чтобы найти это.

  $i = 0; $found = array(); while ($i < count($needle)) { $x = 0; while ($x < count($haystack)) { if (strpos($haystack[$x], $needle[$i]) !== false) { array_push($found, $haystack[$x]); } $x++; } $i++; } $found = array_count_values($found); 

$found массив $found содержит список всех совпадающих игл, элемент массива с наивысшим значением счета будет строкой (строками), которую вы ищете, вы можете получить это с помощью:

 print_r(array_search(max($found), $found)); 

Вы также можете попробовать использовать strpbrk () для отрицания (ни одна из писем не найдена):

 $find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; if(strpbrk($string, implode($find_letters)) === false) { echo 'None of these letters are found in the string!'; } 

Ответ на @binyamin и @Timo .. (недостаточно очков, чтобы добавить комментарий ..), но результат не содержит позиции ..
В приведенном ниже коде будет возвращено фактическое положение первого элемента, для которого предназначено strpos. Это полезно, если вы ожидаете найти ровно 1 матч. Если вы ожидаете найти несколько совпадений, то позиция первого найденного может быть бессмысленной.

 function strposa($haystack, $needle, $offset=0) { if(!is_array($needle)) $needle = array($needle); foreach($needle as $query) { $res=strpos($haystack, $query, $offset); if($res !== false) return $res; // stop on first true result } return false; }