Trên đây là đúng nếu chúng ta giả định rằng mảng có thể chứa chỉ chuỗi, nhưng mảng có thể chứa các mảng khác. Ngoài ra hàm in_array() có thể chấp nhận một mảng cho $ kim, vì vậy strtolower ($ kim) sẽ không hoạt động nếu $ kim là một mảng và array_map ('strtolower', $ haystack) sẽ không hoạt động nếu $ haystack chứa khác mảng, nhưng sẽ dẫn đến "cảnh báo PHP: strtolower() hy vọng tham số 1 là chuỗi, mảng được cho".
Ví dụ:
$needle = array('p', 'H');
$haystack = array(array('p', 'H'), 'U');
Vì vậy, tôi đã tạo ra một lớp helper với các phương pháp releveant, để làm cho trường hợp nhạy cảm và case-insensitive in_array() kiểm tra. Tôi cũng đang sử dụng mb_strtolower() thay cho strtolower(), vì vậy các mã hóa khác có thể được sử dụng. Dưới đây là các mã:
class StringHelper {
public static function toLower($string, $encoding = 'UTF-8')
{
return mb_strtolower($string, $encoding);
}
/**
* Digs into all levels of an array and converts all string values to lowercase
*/
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;
}
/**
* Works like the built-in PHP in_array() function — Checks if a value exists in an array, but
* gives the option to choose how the comparison is done - case-sensitive or case-insensitive
*/
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;
}
}
}
+1 gợi ý tốt – cletus
Chắc chắn là giải pháp thanh lịch nhất. – Gazler
sử dụng cụm từ thông dụng không phải là giải pháp tốt, vì nó có thể chậm ... có thể array_map nhanh hơn –