복붙노트

strpos에서 바늘로 배열 사용하기

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

이걸 사용하면 작동하지 않을 것이므로, 이와 같은 것이 있으면 좋을 것입니다.

해결법

  1. ==============================

    1.@ http://www.php.net/manual/en/function.strpos.php#107351에서 업데이트 된 스 니펫을 작성하십시오.

    @ 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를 반환합니다.

    업데이트 : 첫 번째 바늘을 발견했을 때 멈춤 코드 개선 :

    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. ==============================

    2.아래의 코드는이를 수행하는 방법을 보여줄뿐만 아니라 사용하기 쉬운 기능으로 전달합니다. "jesda"가 썼습니다. (나는 그것을 온라인으로 발견했다)

    아래의 코드는이를 수행하는 방법을 보여줄뿐만 아니라 사용하기 쉬운 기능으로 전달합니다. "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 
    
  3. ==============================

    3.str_replace는 상당히 빠릅니다.

    str_replace는 상당히 빠릅니다.

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

    4.strpos가 false를 반환하면 배열을 반복하고 "플래그"값을 설정할 수 있습니다.

    strpos가 false를 반환하면 배열을 반복하고 "플래그"값을 설정할 수 있습니다.

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

    그런 다음 $ flag의 값을 확인하십시오.

  5. ==============================

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

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

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

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

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

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

    7.질문은 제공된 예제가 "예제"입니까, 아니면 정확히 원하는 것입니까? 여기에는 여러 가지 답변이 혼합되어 있으며, 받아 들여지는 것이 복잡하다는 것을 이해하지 못합니다.

    질문은 제공된 예제가 "예제"입니까, 아니면 정확히 원하는 것입니까? 여기에는 여러 가지 답변이 혼합되어 있으며, 받아 들여지는 것이 복잡하다는 것을 이해하지 못합니다.

    바늘 배열의 모든 내용이 문자열에 있는지 확인하고 신속하게 true 또는 false를 반환합니다.

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

    그렇다면 @ 레옹에게 신용을주십시오.

    이 경우와 같이 바늘 배열의 모든 값이 문자열에 존재하는지 확인하려면 "a", "b"및 "c"세 가지가 모두 있어야합니다. 예를 들어 "예를 들어"

    여기에 나온 많은 해답은 그 맥락에서 벗어나지 만 해결 된 것으로 표시된 것처럼 질문의 의도가 의심 스럽습니다. 예 : 받아 들여진 대답은

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

    그 모든 단어가 반드시 문자열에서 발견되면 어떨까요?

    그런 다음이 페이지에서 "승인되지 않은 답변"을 시도해보십시오.

  8. ==============================

    8.다음 코드로 :

    다음 코드로 :

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

    그런 다음 $ flag의 값을 확인하십시오. 그것이 사실이라면, 모든 편지가 발견되었습니다. 그렇지 않다면 거짓입니다.

  9. ==============================

    9.이것을 시도 할 수 있습니다 :

    이것을 시도 할 수 있습니다 :

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

    10.나는 누군가와 비슷한 것을 찾는 사람들에게 도움이되는 새로운 대답을 쓰고있다.

    나는 누군가와 비슷한 것을 찾는 사람들에게 도움이되는 새로운 대답을 쓰고있다.

    이 기능은 "여러 개의 바늘이 있고 그 중 하나를 찾아내는 데 사용하려고합니다."라는 경우에 작동합니다. 이것이 제가 발견 한 문제입니다.

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

    배열 $은 일치하는 모든 바늘의 목록을 포함 할 것이고, 가장 높은 카운트 값을 가진 배열의 항목은 찾고자하는 문자열이 될 것입니다.

    print_r(array_search(max($found), $found));
    
  11. ==============================

    11.또한 부정을 위해 strpbrk ()를 사용할 수 있습니다 (문자를 찾지 못했습니다).

    또한 부정을 위해 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!';
    }
    
  12. ==============================

    12.@binyamin 및 @Timo .. (주석을 추가 할만한 점수가 충분하지 않습니다.)하지만 결과에는 위치가 포함되지 않습니다. 아래 코드는 strpos가 의도 한 첫 번째 요소의 실제 위치를 반환합니다. 이것은 정확하게 1 개의 일치를 찾으려고 할 때 유용합니다. 여러 개의 일치를 찾으려면 처음 발견 된 위치가 의미가 없을 수 있습니다.

    @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;
    }
    
  13. ==============================

    13.이것은 나의 접근법이다. 일치하는 문자열이 발견 될 때까지 문자열의 문자를 반복합니다. 더 큰 배열의 바늘에서는 일치가 발견 된 것을 확인하기 위해 모든 바늘을 검사 할 필요가 없으므로 허용 된 답변보다 성능이 우수합니다.

    이것은 나의 접근법이다. 일치하는 문자열이 발견 될 때까지 문자열의 문자를 반복합니다. 더 큰 배열의 바늘에서는 일치가 발견 된 것을 확인하기 위해 모든 바늘을 검사 할 필요가 없으므로 허용 된 답변보다 성능이 우수합니다.

    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 $ 바늘로 배열을 만들었다. 7 점 미만의 응답이 내 성능을 능가했지만 7 점이 훨씬 더 빨랐습니다.

  14. ==============================

    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;
    }
    
  15. from https://stackoverflow.com/questions/6284553/using-an-array-as-needles-in-strpos by cc-by-sa and MIT license