Использование массива в качестве игл в 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!';
}
потому что при использовании этого, это не будет работать, было бы хорошо, если бы было что-то вроде этого
14 ответов:
@Dave обновленный фрагмент из 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
как str_replace значительно быстрее.
$find_letters = array('a', 'c', 'd'); $string = 'abcdefg'; $match = (str_replace($find_letters, '', $string) != $string);
вы можете перебирать массив и установить значение "флаг", если
strposвозвращаетfalse.$flag = false; foreach ($find_letters as $letter) { if (strpos($string, $letter) === false) { $flag = true; } }затем проверьте значение
$flag.
Если вы просто хотите проверить, если определенные символы в строке или нет, использовать функции 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'должен присутствовать, как вы упомянули как ваш "например"Эхо ' все буквы находятся в строке!';
многие ответы здесь выходят из этого контекста, но я сомневаюсь, что интенция вопроса, как вы отметили, разрешена. Например, принятый ответ-это игла из
$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будет содержать список всех совпадающих игл, элемент массива с самым высоким значением счетчика будет строкой (АМИ), которую вы ищете, вы можете получить это с: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; }
Это мой подход. Перебрать символы в строке, пока не будет найдено. На большем массиве Игл это превзойдет принятый ответ, потому что ему не нужно проверять каждую иглу, чтобы определить, что совпадение было найдено.
function strpos_array($haystack, $needles = [], $offset = 0) { for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){ if (in_array($haystack[$i],$needles)) { return $i; } } return false; }это очень просто и эффективно. Я сопоставил это с принятым ответом и с массивом 7
$needlesэти две функции были примерно на одном уровне. Меньше чем 7 принято отвечать превзошла мои, но больше, чем 7 это было резко быстрее.
просто обновление сверху ответы
function strsearch($findme, $source){ if(is_array($findme)){ if(str_replace($findme, '', $source) != $source){ return true; } }else{ if(strpos($source,$findme)){ return true; } } return false; }
Comments