PHP不区分大小写的in_array函数


131

使用该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本身无法做到这一点。

Answers:


101

您可以使用preg_grep()

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

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

37
使用正则表达式不是一个好的解决方案,因为它可能很慢...也许array_map更快
phil-opp

5
要使其代替in_array并返回布尔值,它变为: count(preg_grep('/^'.preg_quote($needle).'/$',$a)>0)。那不是那么优雅。(注意,除非需要部分匹配,否则必须使用^和$字符。)但是,如果您实际上希望返回匹配的条目,则我喜欢这种解决方案。
达伦·库克

2
最后一条注释包含语法错误:/ $应该是$ /。
Gogowitsch 2012年

1
据我所知,@ DarrenCook在布尔类型转换中也可以工作(bool)preg_grep('/ ^'。preg_quote($ needle)。'$ /',$ a),因为空数组将转换为false
arraintxo

8
似乎更简单的方法是将其转换为小写。
2014年

229

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

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)]) { 
  ...

这里唯一的问题是数组键必须是唯一的,因此,如果发生冲突(例如“一个”和“一个”),您将丢失除一个之外的所有键。


23
这应该是公认的答案。添加正则表达式有时只会造成两个问题。
2014年

1
这里不是将array_flip代替array_combine还是一个更快的解决方案?$ search_array = array_flip(array_map('strtolower',$ a));
jakub_jo 2016年

一行:in_array(strtolower($ word),array_map('strtolower',$ array))
Andrew

1
@Akira Yamamoto- “修复语法”编辑是什么?我们不允许在此处修复代码。我回滚了。
Funk Forty Niner,


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

文档


3
您应该阻止从其他地方获得的引用代码(或任何其他内容)。
cletus

3
只是要清楚。这不是批评。只是一个建议(只有我的意见,没有官方的说法)。:)至少如果我从页面中复制代码段,则将其引用。
cletus

3
另外,使用代码块可以更好地描述它,因为它是“代码”。块引用不允许对其进行正确的格式设置。
泰勒·卡特

我立场正确,在使用实际按钮添加>到每一行后,它可以正常工作。我只是习惯于手动将其>放在第一行。
泰勒·卡特

我习惯于使用ctrl-Q来做到这一点。代码块有一个问题,因为它出于某种原因会换行。不要问我为什么。但是您可以改正该错误,也可以手动>在每行的开头放置一个。
cletus 2010年

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

资料来源:php.net in_array手册页。


如果您知道数组中的内容,则可以省略array_map;但这是一个很好的例子。

2
我是真的 因为在每次调用时映射数组都是很荒谬的。
cletus 2010年

另外,假设(如Chacha)这直接来自文档,最好将其引用起来。
cletus

10

假设您要使用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";
     }

}

2

如果我们假设数组只能包含字符串,但是数组也可以包含其他数组,则以上内容是正确的。另外in_array()函数可以接受$ needle的数组,因此如果$ needle是数组,则strtolower($ needle)不起作用,如果$ haystack包含其他数组,则array_map('strtolower',$ 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;
    }
}
}

1

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

功能:

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

1
/**
 * 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);

}

最后。有人花了8年的时间才提出并提供最有效的技术- 早期return。当只需要找到一根针时,在找到它之后保持迭代是没有意义的。我会修正一个错字,烘烤$ strict概念并做一些改进,也许接近3v4l.org/WCTi2。这篇文章并不完美,但它的心在正确的位置。
mickmackusa

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

1
请添加您要提出的解决方案的描述。
il_raffa 2015年

-2
  • in_array接受以下参数:in_array(search,array,type)
  • 如果搜索参数是字符串并且类型参数设置为TRUE,则搜索区分大小写。
  • 因此,为了使搜索忽略大小写,像这样使用它就足够了:

$ a = array('一个','两个','三个','四个');

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


6
第三个参数控制是否检查变量的类型,而不是case。当使用true严格的类型比较时,例如'1' !== 1。当使用false类型杂耍时,例如'1' == 1。有关文档,请参见php.net/in_arrayphp.net/manual/en/types.comparisons.php
leepower
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.