doudeng5764
2015-05-31 08:51
浏览 137
已采纳

如何让in_array()不区分大小写?

Using this code to check if a value exists in an array but sometimes the array may contain values in uppercase. My lookup value is always in lowercase. I cannot control the array data as its dynamically generated from a database so I need a solution that will ignore the case (uppercase/lowercase).

If the lookup value exists in the array I would like it to match regardless of case sensitivity.

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

output of var_dump($url);:

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

output of 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"
}
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • dousha2020 2015-05-31 08:53
    已采纳

    Well if you can make sure, that the search word is always in lowercase, just also put the array in lower case by looping through all values with array_map() and putting them in lowercase with strtolower(), e.g.

    if (in_array('lookupvalue', array_map("strtolower", $array))) {
    // do something
    }
    
    打赏 评论
  • drnpwmq4536 2015-05-31 08:56

    If @Rizier's array_map isn't good for you (don't know why), you can use preg_grep function.

    $array = array('Lookupvalue', 'second', 'third');
    if (preg_grep('/^lookupVALUE$/i', $array)) {
        echo 'exists';
    }
    

    Notice to array_map:
    Maybe in Rizier's solution missing strtolower at the first parameter (if you can get it with capitals) to make it completely case-insensitive,

    if (in_array(strtolower('LookupVALUE'), array_map('strtolower', $array))) {
        echo 'exists';
    }
    
    打赏 评论
  • donglong9745 2015-05-31 09:07

    You can use array_uintersect() for this:

    <?php
    
    $haystack = [
      'apple',
      'banana',
      'cherry',
      'PineApple',
      'PEAR',
    ];
    
    echo (
        array_uintersect(['pineapple'], $haystack, 'strcasecmp')
    ) ? "found
    " : "not found
    ";
    

    It computes the intersection of two arrays by means of a user defined function. You feed it two array, one holding your needle, one being your haystack. As a compare function you simply use php's strcasecmp() function.

    So in the end your condition is a one-liner:

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

    Which, since this is php, can be simplified to:

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

    Obviously you can also define a static function for this:

    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!";
    
    打赏 评论

相关推荐 更多相似问题