[php] 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!';
}

이거 사용하면 안 되니까 이런게 있으면 좋을 텐데



답변

@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


답변

str_replace는 상당히 빠릅니다.

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


답변

아래 코드는이를 수행하는 방법을 보여줄뿐만 아니라 사용하기 쉬운 기능에 추가합니다. “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.


답변

특정 문자가 실제로 문자열에 있는지 확인하려면 strtok 사용하십시오 .

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


답변

질문은 제공된 예제가 단지 “예”일 뿐입니 까 아니면 정확히 찾고있는 것입니까? 여기에는 여러 가지 혼합 된 답변이 있으며 허용되는 답변의 복잡성을 이해하지 못합니다.

여부를 확인하려면 모든 컨텐츠 바늘의 배열이 문자열에 존재하고 신속하게 참 또는 거짓을 반환합니다 :

$string = 'abcdefg';

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

그렇다면 @Leon 에게 크레딧을 제공하십시오 .

여부를 확인하려면 ALL의바늘의 배열이 존재하는 이 경우에서와 같이 문자열에, 세 가지를 모두 'a', 'b'하고 'c'당신이 언급처럼, 존재해야합니다 귀하의 “예”로

echo ‘문자열에서 모든 글자를 찾았습니다!’;

여기에 많은 답변이 그 맥락에서 벗어 났지만 해결 된 것으로 표시 한 질문의 의도가 의심됩니다. 예 : 허용되는 대답은 다음의 바늘입니다.

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

모든 단어 가 문자열에서 반드시 발견되어야 한다면 ?

그런 다음 "not accepted answers"이 페이지 에서 몇 가지를 시도해보십시오 .


답변

이 표현식은 모든 문자를 검색합니다.

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