it-roy-ru.com

Использование массива в качестве иглы в 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!';
}

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

73
MacMac

@ Отправьте обновленный фрагмент из 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".

Update: Улучшен код с остановом при обнаружении первой из игл:

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
116
Binyamin

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

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

Приведенный ниже код не только показывает, как это сделать, но и превращает его в простую в использовании функцию, продвигающуюся вперед. Это было написано "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 
15
Dave

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

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

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

6
Evan Mulawski

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

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

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

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

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

Чтобы выяснить, существует ли в строке КАКОЕ-ЛИБО содержимое из массива игл, и quick вернет 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" на этой странице.

2
Jonas Lundman

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

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 это было значительно быстрее.

1
billynoah

Вы также можете попробовать использовать 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!';
}
1

Вы можете попробовать это: 

function in_array_strpos($Word, $array){

foreach($array as $a){

    if (strpos($Word,$a) !== false) {
        return true;
    }
}

return false;
}
1
Rajnesh Nadan

Ответьте @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;
}
0
CO4 Computing

Просто апгрейд сверху ответы

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;
}
0
Andy Nguyen

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

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

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

0
hakre

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

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

    $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));
0
ConorReidd