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

什么function或一组function可以做同样的事情? 我不认为in_array本身可以做到这一点。

你可以使用preg_grep()

 $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 

显而易见的事情只是将search词转换为小写:

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

当然,如果数组中有大写字母,则需要先执行以下操作:

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

并search。 在每一次search中,对整个arrays进行strtolower没有意义。

然而,search数组是线性的。 如果你有一个大型的数组,或者你会做很多事情,最好将search条件放在数组的键中,因为这样会更快地访问:

 $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,这里是你如何使search不区分大小写。

不区分大小写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"; } } 

如果我们假设数组只能包含string,上面的说法是正确的,但是数组也可以包含其他数组。 另外in_array()函数可以接受$ needle的数组,所以strtolower($ needle)不会工作,如果$ needle是一个数组,array_map('strtolower',$ haystack)不会工作,如果$ haystack包含其他数组,但会导致“PHP警告:strtolower()期望参数1是string,给定数组”。

例:

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

所以我创build了一个辅助类与相关的方法,使区分大小写和不区分大小写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:

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