[php] 대소 문자를 구분하지 않는 PHP in_array 함수

in_array함수를 사용할 때 대소 문자를 구분하지 않는 비교가 가능 합니까?

따라서 다음과 같은 소스 배열을 사용하십시오.

$a= array(
 'one',
 'two',
 'three',
 'four'
);

다음 조회는 모두 true를 반환합니다.

in_array('one', $a);
in_array('two', $a);
in_array('ONE', $a);
in_array('fOUr', $a);

어떤 기능 또는 일련의 기능이 동일합니까? 나는 in_array그 자체가 이것을 할 수 있다고 생각하지 않습니다 .



답변

당신은 사용할 수 있습니다 preg_grep():

$a= array(
 'one',
 'two',
 'three',
 'four'
);

print_r( preg_grep( "/ONe/i" , $a ) );


답변

분명한 것은 검색어를 소문자로 변환하는 것입니다.

if (in_array(strtolower($word), $array)) {
  ...

물론 배열에 대문자가 있으면 먼저이 작업을 수행해야합니다.

$search_array = array_map('strtolower', $array);

검색하십시오. strtolower검색 할 때마다 전체 배열을 수행 할 필요는 없습니다 .

그러나 배열 검색은 선형입니다. 배열이 크거나이 작업을 많이 수행하려는 경우 훨씬 빠른 액세스 가 가능하므로 검색어를 배열의 키에 배치하는 것이 좋습니다 .

$search_array = array_combine(array_map('strtolower', $a), $a);

그때

if ($search_array[strtolower($word)]) {
  ...

여기서 유일한 문제는 배열 키가 고유해야하기 때문에 충돌이있는 경우 (예 : “하나”와 “하나”) 하나를 제외한 모든 것을 잃게됩니다.


답변

function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}

에서 문서


답변

function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}

출처 : php.net in_array 매뉴얼 페이지.


답변

in_array를 사용하고 싶다고 가정 해 봅시다. 다음은 검색 대소 문자를 구분하지 않는 방법입니다.

대소 문자를 구분하지 않는 in_array () :

foreach($searchKey as $key => $subkey) {

     if (in_array(strtolower($subkey), array_map("strtolower", $subarray)))
     {
        echo "found";
     }

}

대소 문자 구분 :

foreach($searchKey as $key => $subkey) {

if (in_array("$subkey", $subarray))

     {
        echo "found";
     }

}


답변

배열은 문자열 만 포함 할 수 있지만 배열은 다른 배열도 포함 할 수 있다고 가정하면 위의 내용이 정확합니다. 또한 in_array () 함수는 $ needle에 대한 배열을 허용 할 수 있으므로 $ needle이 배열이고 $ haystack에 다른 것이 포함되어 있으면 array_map ( ‘strtolower’, $ haystack)이 작동하지 않으면 strtolower ($ needle)가 작동하지 않습니다 “PHP 경고 : strtolower ()는 매개 변수 1이 문자열이며 배열이 주어질 것으로 예상합니다.”

예:

$needle = array('p', 'H');
$haystack = array(array('p', 'H'), 'U');

그래서 대소 문자를 구분하고 대소 문자를 구분하지 않는 in_array () 검사를하기 위해 관련 메소드를 사용하여 도우미 클래스를 만들었습니다. strtolower () 대신 mb_strtolower ()를 사용하고 있으므로 다른 인코딩을 사용할 수 있습니다. 코드는 다음과 같습니다.

class StringHelper {

public static function toLower($string, $encoding = 'UTF-8')
{
    return mb_strtolower($string, $encoding);
}

/**
 * Digs into all levels of an array and converts all string values to lowercase
 */
public static function arrayToLower($array)
{
    foreach ($array as &$value) {
        switch (true) {
            case is_string($value):
                $value = self::toLower($value);
                break;
            case is_array($value):
                $value = self::arrayToLower($value);
                break;
        }
    }
    return $array;
}

/**
 * Works like the built-in PHP in_array() function — Checks if a value exists in an array, but
 * gives the option to choose how the comparison is done - case-sensitive or case-insensitive
 */
public static function inArray($needle, $haystack, $case = 'case-sensitive', $strict = false)
{
    switch ($case) {
        default:
        case 'case-sensitive':
        case 'cs':
            return in_array($needle, $haystack, $strict);
            break;
        case 'case-insensitive':
        case 'ci':
            if (is_array($needle)) {
                return in_array(self::arrayToLower($needle), self::arrayToLower($haystack), $strict);
            } else {
                return in_array(self::toLower($needle), self::arrayToLower($haystack), $strict);
            }
            break;
    }
}
}


답변

코드가 아래에있는 배열에서 둔감 한 값을 확인하는 간단한 함수를 작성했습니다.

함수:

function in_array_insensitive($needle, $haystack) {
   $needle = strtolower($needle);
   foreach($haystack as $k => $v) {
      $haystack[$k] = strtolower($v);
   }
   return in_array($needle, $haystack);
}

사용하는 방법:

$array = array('one', 'two', 'three', 'four');
var_dump(in_array_insensitive('fOUr', $array));