不区分大小写的数组搜索

77

我有一个像这样的数组:

$array = Array ( 0 => 'oooo',
                 1 => 'no',
                 2 => 'mmmm', 
                 3 => 'yes' ); 

我想要搜索一个单词 "yes"。我知道有 array_search() 函数,但我也想匹配 "yes"、"Yes" 和 "YES"。

我该如何做到呢?


7
抱歉,我无法理解您的请求。请提供需要翻译的英文文本。 - Galen
2
9个问题没有被接受的答案。不行。对于一个糟糕的问题,扣1分。突出代码并使用''修复字符串。 - Shoe
3个回答

194
array_search(strtolower($search), array_map('strtolower', $array));

12
"array_map"是一个非常有用的函数,也许现在我终于记住了它的用途!请不要改变原文意思,只翻译。 - Brock Hensley
1
请注意,array_map('strtolower' ...) 无法处理 Cyrillic 字符!可能是因为 utf-8 整体编码,除了拉丁字符。 - Nikolay Ivanov
2
@NikolayIvanov 取决于语言环境:php.net/strtolower。如果您不想依赖操作系统的区域设置,您最好使用 mb_strtolower,但这当然还不够:例如请参见 此评论。由于 PHP 没有像 Java 或 C# 那样支持本地化的字符串处理函数,您必须根据需要实现自己的字符串类/函数 :) 这是“UTF-8 万能论”并不能解决所有问题的领域之一... - Halil Özgür
1
注意,如果您的数组键值很重要(通常是这样),那么这种方法行不通,因为 array_map 会从0开始重新编号。因此返回的值将没有意义。 - Chadwick Meyer
@ChadwickMeyer 我注意到键的重新映射并不总是发生。 - bart
显示剩余5条评论

5
你可以使用in_array()代替array_search()
$response = in_array('yes', array_map('strtolower', $array));

2
注意:PHP网站上的用户评论指出,使用“严格”搜索并将true作为第三个参数添加到in_array函数中可能会给出更可预测的结果:$is_there = in_array('yes', array_map('strtolower', $array), true); - Niki Romagnoli
这就是为什么要使用 array_map('strtolower', $array),将整个数组规范化为小写的原因。 - brunohdaniel
这取决于期望的结果是什么。 - tfont
@brunohdaniel 这不仅与大小写有关,还取决于数组的值。无论如何,请看一下我上面提到的评论,非常有趣(现在我可以链接它了,当时没有永久链接)。 - Niki Romagnoli

1

我举了一个例子,但我想在数组中搜索任何单词。 - Gowri
@Ashley - 这对于单字节很好,有关于多字节的建议吗? - ajreal
@gowri 将 $search 更改为您想要搜索的任何内容。 - Ashley
1
@ajreal 你是在谈论键还是值?这个链接可能会有所帮助:http://www.php.net/manual/en/function.array-change-key-case.php#82522 - Ashley
@Ashley - 值,如果值是多字节的呢? - ajreal
使用答案中链接的函数,然后使用http://php.net/manual/en/function.mb-strtolower.php。 - Ashley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接