PHP不区分大小写的in_array函数

lee*_*ers 119 php arrays

使用该in_array函数时是否可以进行不区分大小写的比较?

所以使用这样的源数组:

$a= array(
 'one',
 'two',
 'three',
 'four'
);
Run Code Online (Sandbox Code Playgroud)

以下查找都将返回true:

in_array('one', $a);
in_array('two', $a);
in_array('ONE', $a);
in_array('fOUr', $a);
Run Code Online (Sandbox Code Playgroud)

哪些功能或一组功能可以做同样的事情?我认为in_array自己无法做到这一点.

cle*_*tus 210

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

if (in_array(strtolower($word), $a) { 
  ...
Run Code Online (Sandbox Code Playgroud)

当然,如果数组中有大写字母,您首先需要这样做:

$search_array = array_map('strtolower', $a);
Run Code Online (Sandbox Code Playgroud)

并搜索.strtolower每次搜索对整个阵列都没有意义.

然而,搜索数组是线性的.如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是很多快速访问:

$search_array = array_combine(array_map('strtolower', $a), $a);
Run Code Online (Sandbox Code Playgroud)

然后

if ($search_array[strtolower($word)]) { 
  ...
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是数组键必须是唯一的,所以如果你有碰撞(例如"一"和"一"),你将失去除一个之外的所有.

  • 这应该是公认的答案.添加正则表达式有时只会产生2个问题. (20认同)
  • 一行: in_array(strtolower($word), array_map('strtolower', $array)) (2认同)

Tyl*_*ter 108

function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}
Run Code Online (Sandbox Code Playgroud)

来自文档

  • 我认为带有链接的"来自文档"就足够了...... (23认同)
  • 你应该阻止从其他地方获得的代码(或任何真正的代码). (3认同)
  • 另外,使用代码块可以更好地描述它,因为它是"代码".阻止引用它不允许正确格式化它. (3认同)
  • 只是要清楚。这不是批评。只是一个建议(只有我的意见,没有官方的说法)。:)至少如果我从页面中复制代码段,则将其引用。 (2认同)
  • 您可以将代码块放在块引号内。 (2认同)

gho*_*g74 93

你可以使用preg_grep():

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

print_r( preg_grep( "/ONe/i" , $a ) );
Run Code Online (Sandbox Code Playgroud)

  • 使用正则表达式不是一个好的解决方案,因为它可能很慢...也许array_map更快 (37认同)
  • 似乎更简单的方法就是转换为小写. (7认同)
  • 为了使它成为in_array的替代品,返回一个bool,它变为:`count(preg_grep('/ ^'.preg_quote($ needle).'/ $',$ a)> 0)`.那么不那么优雅.(注意^和$字符是必需的,除非需要部分匹配.)但是如果你真的想要返回匹配的条目,我喜欢这个解决方案. (4认同)
  • 最后一条评论包含语法错误:/ $应为$ /. (2认同)

Gaz*_*ler 47

function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}
Run Code Online (Sandbox Code Playgroud)

来源:php.net in_array手册页.

  • 谁投下了一个非常好的例子和解决方案? (2认同)
  • 我确实做到了.因为在每次调用时映射数组都是荒谬的. (2认同)

Mik*_*e Q 9

假设您要使用in_array,以下是如何使搜索大小写不敏感的方法.

不区分大小写的in_array():

foreach($searchKey as $key => $subkey) {

     if (in_array(strtolower($subkey), array_map("strtolower", $subarray)))
     {
        echo "found";
     }

}
Run Code Online (Sandbox Code Playgroud)

正常区分大小写:

foreach($searchKey as $key => $subkey) {

if (in_array("$subkey", $subarray))

     {
        echo "found";
     }

}
Run Code Online (Sandbox Code Playgroud)