2015-05-31 2 views
1

Используя этот код, чтобы проверить, существует ли значение в массиве, но иногда массив может содержать значения в верхнем регистре. Мой значение поиска всегда в нижнем регистре. Я не могу контролировать данные массива, поскольку он динамически генерируется из базы данных, поэтому мне нужно решение, которое будет игнорировать случай (в верхнем и нижнем регистре).Как я могу получить in_array() без учета регистра?

Если значение поиска существует в массиве, я бы хотел, чтобы оно соответствовало независимо от чувствительности к регистру.

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

Ну, если вы можете убедиться, что искомое слово всегда в нижнем регистре, как раз и поместить массив в нижнем регистре, перебирая все значения с помощью array_map() и помещая их в нижний регистр с strtolower(), например

if (in_array('lookupvalue', array_map("strtolower", $array))) { 
// do something 
} 
+0

Пожалуйста, объясните нижний предел, чтобы я мог улучшить свой ответ. – Rizier123

+0

Я не отмечал его d собственный .. не уверен, кто сделал? но плохо дать ваш код. – user3436467

+1

, похоже, не работает. – user3436467

2

Если @ Rizier-х array_map не хорошо для вас (не знаю почему), вы можете использовать функцию preg_grep.

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

Уведомление array_map:
Maybe в растворе Rizier хватает strtolower в качестве первого параметра (если вы можете получить его с капителями), чтобы сделать его полностью нечувствительным к регистру,

if (in_array(strtolower('LookupVALUE'), array_map('strtolower', $array))) { 
    echo 'exists'; 
} 
+0

спасибо panther, я попробовал второе решение, но не пошел. Я обновил свой пост с помощью массива sample, чтобы вы могли видеть содержимое массива. Мое значение поиска составляет 100% в нижнем регистре – user3436467

+0

Нет причин, по которым решение Rizier с array_map не должно работать. Покажите нам, как вы его реализуете. Он должен работать. – panther

+0

'if (in_array ('www.paypal.com.au', array_map (" strtolower ", $ array))) { \t echo 'exists'; } 'работает, если в вашем массиве есть' WWW.PAYPAL.COM.AU'. – panther

3

Вы можете использовать array_uintersect() для этого:

<?php 

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

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

Он вычисляет пересечение ТВт o с помощью пользовательской функции. Вы кормите его двумя массивами, один держит свою иглу, а один - стог сена. В качестве функции сравнения вы просто используете функцию 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!";