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本身可以做到这一点。

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

资料来源: Net in _ array 手册页。

最明显的做法就是将搜索词转换为小写:

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

来自 文件

你可以使用 preg_grep():

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


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

如果我们假设数组只能包含字符串,但是数组也可以包含其他数组,那么上述假设是正确的。同样,in _ array ()函数可以接受一个数组,表示 $need,所以如果 $need 是一个数组,strtolower ($needle)就不能工作,如果 $haystack 包含其他数组,array _ map (‘ strtolow’,$haystack)就不能工作,但是会导致“ PHP 警告: strtolower ()希望参数1是字符串,数组已知”。

例如:

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

因此,我使用相关的方法创建了一个 helper 类,以进行区分大小写和不区分大小写的 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;
}
}
}
$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);

我编写了一个简单的函数来检查下面代码所示的数组中的不敏感值。

功能:

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

假设您想使用 in _ array,以下是如何使搜索不区分大小写的方法。

在 _ 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 接受这些参数: in _ array (search、 array、 type)
  • 如果搜索参数是字符串并且类型参数设置为 TRUE,则搜索是区分大小写的。
  • 所以为了让搜索忽略这种情况,像这样使用就足够了:

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

$b = in _ array (‘ ONE’,$a,false) ;

/**
* in_array function variant that performs case-insensitive comparison when needle is a string.
*
* @param mixed $needle
* @param array $haystack
* @param bool $strict
*
* @return bool
*/
function in_arrayi($needle, array $haystack, bool $strict = false): bool
{


if (is_string($needle)) {


$needle = strtolower($needle);


foreach ($haystack as $value) {


if (is_string($value)) {
if (strtolower($value) === $needle) {
return true;
}
}


}


return false;


}


return in_array($needle, $haystack, $strict);


}




/**
* in_array function variant that performs case-insensitive comparison when needle is a string.
* Multibyte version.
*
* @param mixed $needle
* @param array $haystack
* @param bool $strict
* @param string|null $encoding
*
* @return bool
*/
function mb_in_arrayi($needle, array $haystack, bool $strict = false, ?string $encoding = null): bool
{


if (null === $encoding) {
$encoding = mb_internal_encoding();
}


if (is_string($needle)) {


$needle = mb_strtolower($needle, $encoding);


foreach ($haystack as $value) {


if (is_string($value)) {
if (mb_strtolower($value, $encoding) === $needle) {
return true;
}
}


}


return false;


}


return in_array($needle, $haystack, $strict);


}
$user_agent = 'yandeX';
$bots = ['Google','Yahoo','Yandex'];
        

foreach($bots as $b){
if( stripos( $user_agent, $b ) !== false ) return $b;
}

为什么不使用对 regex 大小写不敏感的搜索呢? 这样会忽略大海捞针中的大小写:

$haystack = array('MacKnight', 'MacManus', 'MacManUS', 'MacMurray');
$needle='MacMANUS';
$regex='/'.$needle.'/i';
$matches  = preg_grep ($regex, $haystack);
if($m=current($matches)){ // find first case insensitive match
echo 'match found: '.$m;
}else{
echo 'no match found.';
}