Использование массива в виде игл в 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!';
}
Потому что при использовании этого он не сработает, было бы хорошо, если бы что-то вроде этого
Ответы
Ответ 1
@Добавить обновленный фрагмент из 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
Ответ 2
str_replace значительно быстрее.
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
Ответ 3
В приведенном ниже коде не только показано, как это сделать, но и помещается в простую в использовании функцию, перемещающуюся вперед. Это было написано "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
Ответ 4
Вы можете выполнить итерацию по массиву и установить значение "флаг", если strpos
возвращает false
.
$flag = false;
foreach ($find_letters as $letter)
{
if (strpos($string, $letter) === false)
{
$flag = true;
}
}
Затем проверьте значение $flag
.
Ответ 5
Если вы просто хотите проверить, действительно ли определенные символы в строке или нет, используйте strtok:
$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
// not found
} else {
// found
}
Ответ 6
Это выражение ищет все буквы:
count(array_filter(
array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
Ответ 7
Вы также можете попробовать 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!';
}
Ответ 8
Вопрос, является ли приведенный пример просто "примером" или точным, что вы ищете? Здесь много смешанных ответов, и я не понимаю сложность принятого.
Чтобы узнать, существует ли в строке ЛЮБОЕ содержимое массива игл, а быстро возвращает 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"
на этой странице.
Ответ 9
Это мой подход. Перебирайте символы в строке, пока не найдете совпадение. На большем множестве игл это превзойдет принятый ответ, потому что не нужно проверять каждую иглу, чтобы определить, что совпадение найдено.
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;
}
Я сравнил это с принятым ответом, и с набором $needles
более 7 $needles
это было значительно быстрее.
Ответ 10
Со следующим кодом:
$flag = true;
foreach($find_letters as $letter)
if(false===strpos($string, $letter)) {
$flag = false;
break;
}
Затем проверьте значение $flag
. Если оно true
, все буквы найдены. Если нет, то false
.
Ответ 11
Вы можете попробовать следующее:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
Ответ 12
Я пишу новый ответ, который, надеюсь, поможет любому, кто ищет то, что я есть.
Это работает в случае "У меня несколько иголок, и я пытаюсь использовать их для поиска выделенной строки". и это вопрос, который я нашел, чтобы найти это.
$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));
Ответ 13
Ответ на @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;
}
Ответ 14
Просто апгрейд сверху ответы
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;
}