Powyższe jest poprawne, jeśli założymy, że tablice mogą zawierać tylko łańcuchy, ale tablice mogą również zawierać inne tablice. Również funkcja in_array () może akceptować tablicę dla $ needle, więc strtolower ($ needle) nie będzie działać, jeśli $ needle jest tablicą, a array_map ('strtolower', $ haystack) nie będzie działać, jeśli $ haystack zawiera inne tablice, ale spowoduje "ostrzeżenie PHP: strtolower () oczekuje, że parametr 1 będzie ciągiem, podana tablica".
Przykład:
$needle = array('p', 'H');
$haystack = array(array('p', 'H'), 'U');
Dlatego utworzyłem klasę pomocniczą z odpowiednimi metodami, aby przeprowadzać kontrole in_array () z uwzględnieniem wielkości liter i bez uwzględniania wielkości liter. Używam również mb_strtolower () zamiast strtolower (), więc można użyć innych kodowań. Oto kod:
class StringHelper {
public static function toLower($string, $encoding = 'UTF-8')
{
return mb_strtolower($string, $encoding);
}
public static function arrayToLower($array)
{
foreach ($array as &$value) {
switch (true) {
case is_string($value):
$value = self::toLower($value);
break;
case is_array($value):
$value = self::arrayToLower($value);
break;
}
}
return $array;
}
public static function inArray($needle, $haystack, $case = 'case-sensitive', $strict = false)
{
switch ($case) {
default:
case 'case-sensitive':
case 'cs':
return in_array($needle, $haystack, $strict);
break;
case 'case-insensitive':
case 'ci':
if (is_array($needle)) {
return in_array(self::arrayToLower($needle), self::arrayToLower($haystack), $strict);
} else {
return in_array(self::toLower($needle), self::arrayToLower($haystack), $strict);
}
break;
}
}
}