PHP без учета регистра в функции массива


можно ли сделать сравнение без учета регистра при использовании

9 101

9 ответов:

можно использовать preg_grep():

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

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

очевидно, что нужно просто преобразовать поисковый запрос в нижний регистр:

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

конечно, если в массиве есть прописные буквы, вам нужно сначала сделать это:

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

и поиска. Нет смысла делать 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, поэтому strtolower ($needle) не будет работать, если $needle является массивом, а array_map ('strtolower', $haystack) не будет работать, если $haystack содержит другие массивы, но приведет к "PHP warning: strtolower () ожидает, что параметр 1 будет строкой, массив задан".

пример:

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

Так я создал вспомогательный класс с релевантными методами, чтобы сделать чувствительные к регистру и нечувствительные к регистру проверки in_array (). Я также использую mb_strtolower () вместо 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));
$a = [1 => 'funny', 3 => 'meshgaat', 15 => 'obi', 2 => 'OMER'];  

$b = 'omer';

function checkArr($x,$array)
{
    $arr = array_values($array);
    $arrlength = count($arr);
    $z = strtolower($x);

    for ($i = 0; $i < $arrlength; $i++) {
        if ($z == strtolower($arr[$i])) {
            echo "yes";
        }  
    } 
};

checkArr($b, $a);
  • in_array принимает следующие параметры : in_array(поиск,массив,тип)
  • если параметр поиска является строкой, а параметр типа имеет значение TRUE, то поиск выполняется с учетом регистра.
  • поэтому для того, чтобы сделать поиск игнорировать случай, было бы достаточно использовать его следующим образом:

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

$b = in_array ('ONE', $a, false);