如何使in_array()函数不区分大小写?

4

使用以下代码来检查值是否存在于数组中,但有时数组中可能包含大写字母的值。我的查找值始终为小写。由于数组数据是从数据库动态生成的,因此我无法控制它,因此需要一种忽略大小写(大写/小写)的解决方案。

如果查找值存在于数组中,我希望它不区分大小写。

if (in_array('lookupvalue', $array)) {
    // do something
}

var_dump($url); 的输出结果:

string(17) "www.paypal.com.au"

var_dump($sans);的输出结果:

array(52) {
  [0]=>
  string(13) "WWW.PAYPAL.AT"
  [1]=>
  string(13) "WWW.PAYPAL.BE"
  [2]=>
  string(13) "WWW.PAYPAL.CA"
  [3]=>
  string(13) "WWW.PAYPAL.CH"
  [4]=>
  string(13) "WWW.PAYPAL.CL"
  [5]=>
  string(13) "WWW.PAYPAL.CN"
  [6]=>
  string(16) "WWW.PAYPAL.CO.ID"
  [7]=>
  string(16) "WWW.PAYPAL.CO.IL"
  [8]=>
  string(16) "WWW.PAYPAL.CO.IN"
  [9]=>
  string(19) "WWW.PAYPAL-MENA.COM"
  [10]=>
  string(16) "WWW.PAYPAL.CO.NZ"
  [11]=>
  string(16) "WWW.PAYPAL.CO.TH"
  [12]=>
  string(16) "WWW.PAYPAL.CO.UK"
  [13]=>
  string(16) "WWW.PAYPAL.CO.ZA"
  [14]=>
  string(17) "WWW.PAYPAL.COM.AR"
  [15]=>
  string(17) "WWW.PAYPAL.COM.AU"
  [16]=>
  string(17) "WWW.PAYPAL.COM.BR"
  [17]=>
  string(17) "WWW.PAYPAL.COM.HK"
  [18]=>
  string(17) "WWW.PAYPAL.COM.MX"
  [19]=>
  string(17) "WWW.PAYPAL.COM.MY"
  [20]=>
  string(17) "WWW.PAYPAL.COM.SA"
  [21]=>
  string(17) "WWW.PAYPAL.COM.SG"
  [22]=>
  string(17) "WWW.PAYPAL.COM.TR"
  [23]=>
  string(17) "WWW.PAYPAL.COM.TW"
  [24]=>
  string(17) "WWW.PAYPAL.COM.VE"
  [25]=>
  string(13) "WWW.PAYPAL.DE"
  [26]=>
  string(13) "WWW.PAYPAL.DK"
  [27]=>
  string(13) "WWW.PAYPAL.ES"
  [28]=>
  string(13) "WWW.PAYPAL.EU"
  [29]=>
  string(13) "WWW.PAYPAL.FI"
  [30]=>
  string(13) "WWW.PAYPAL.FR"
  [31]=>
  string(13) "WWW.PAYPAL.IE"
  [32]=>
  string(13) "WWW.PAYPAL.IT"
  [33]=>
  string(13) "WWW.PAYPAL.JP"
  [34]=>
  string(13) "WWW.PAYPAL.LU"
  [35]=>
  string(13) "WWW.PAYPAL.NL"
  [36]=>
  string(13) "WWW.PAYPAL.NO"
  [37]=>
  string(13) "WWW.PAYPAL.PH"
  [38]=>
  string(13) "WWW.PAYPAL.PL"
  [39]=>
  string(13) "WWW.PAYPAL.PT"
  [40]=>
  string(13) "WWW.PAYPAL.RU"
  [41]=>
  string(13) "WWW.PAYPAL.SE"
  [42]=>
  string(13) "WWW.PAYPAL.VN"
  [43]=>
  string(21) "WWW.THEPAYPALBLOG.COM"
  [44]=>
  string(25) "WWW.PAYPAL-DEUTSCHLAND.DE"
  [45]=>
  string(13) "WWW.PAYPAL.CO"
  [46]=>
  string(17) "WWW.PAYPAL.COM.PE"
  [47]=>
  string(17) "WWW.PAYPAL.COM.PT"
  [48]=>
  string(20) "WWW.PAYPAL-FRANCE.FR"
  [49]=>
  string(20) "WWW.PAYPAL-LATAM.COM"
  [50]=>
  string(23) "WWW.PAYPAL-MARKETING.PL"
  [51]=>
  string(15) "DEMO.PAYPAL.COM"
}
4个回答

10
如果您能确保搜索词始终为小写,则可以通过使用array_map()循环遍历所有值并使用strtolower()将它们转换为小写来使数组也变成小写,例如。
if (in_array('lookupvalue', array_map("strtolower", $array))) {
// do something
}

请解释一下为什么要给我点踩,这样我才能改进我的回答。 - Rizier123
@user3436467 1. 你确定第一个参数是100%小写吗? 2. 你的数组是多维的吗? 3. 你的数组包含多字节字符吗? - Rizier123
@user3436467 请添加 var_dump($yourSearchValue);确切输出,并将您的数组的 print_r() 输出更换为 var_dump($yourArray); 的输出。(如果您在浏览器中,请从源代码中获取输出(右键单击->查看源代码)) - Rizier123
Rizier123,完成了,请查看我的更新帖子,其中包含用于查找值和数组的 var_dump。 - user3436467
@user3436467 是的,否则这将会非常奇怪。 - Rizier123
显示剩余4条评论

8
您可以使用array_uintersect()来实现此功能:
<?php

$haystack = [
  'apple',
  'banana',
  'cherry',
  'PineApple',
  'PEAR',
];

echo (
    array_uintersect(['pineapple'], $haystack, 'strcasecmp')
) ? "found\n" : "not found\n";

通过使用用户定义的函数,它计算两个数组的交集。您需要提供两个数组,一个包含您的“针”,另一个是您的“干草堆”。作为比较函数,您只需使用php的strcasecmp()函数。

因此,最终您的条件是一行代码:

if ([] === array_uintersect([$needle], $haystack, 'strcasecmp'))

因为这是php,所以可以简化为:

if (array_uintersect([$needle], $haystack, 'strcasecmp'))

显然,您也可以为此定义一个静态函数:
function in_array_icase($needle, &$haystack) {
    return array_uintersect([$needle], $haystack, 'strcasecmp');
}

$jewelry = ['ring', 'bracelet', 'TaTToo', 'chain'];
if (in_array_icase('tattoo', $jewelry))
    echo "Yea!";

2
如果 @Rizier 的 array_map 对您不适用(不知道为什么),您可以使用 preg_grep 函数。
$array = array('Lookupvalue', 'second', 'third');
if (preg_grep('/^lookupVALUE$/i', $array)) {
    echo 'exists';
}

提醒给 array_map 的注意事项:
也许在 Rizier 的解决方案中,第一个参数缺少 strtolower(如果你可以得到其中的大写字母),以使其完全不区分大小写。
if (in_array(strtolower('LookupVALUE'), array_map('strtolower', $array))) {
    echo 'exists';
}

谢谢,Panther。我尝试了你的第二个解决方案,但没有成功。我在帖子中更新了示例数组,这样你就可以看到数组的内容了。我的查找值是100%小写。 - user3436467
没有理由Rizier的array_map解决方案不起作用。请展示你如何实现它。它必须能够正常工作。 - pavel
如果您的数组中包含 WWW.PAYPAL.COM.AU,则 if (in_array('www.paypal.com.au', array_map("strtolower", $array))) { echo 'exists'; } 代码将会执行。 - pavel
是的,看起来工作正常。是我的错。我需要更新代码的另一个地方。 - user3436467

0
function searchInArray($text, $array) {
    if (in_array(strtolower($text), array_map("strtolower", $array))) {
    return true;
    }
    return false;
}

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