Нечувствительная к регистру функция in_array

Можно ли проводить сравнение без 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 может это сделать.

Solutions Collecting From Web of "Нечувствительная к регистру функция in_array"

вы можете использовать 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: 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);