2010-01-30 41 views
93

Có thể so sánh trường hợp không phân biệt chữ hoa chữ thường khi sử dụng hàm in_array không?Hàm in_array không phân biệt chữ hoa chữ thường

Vì vậy, với một mảng nguồn như thế này:

$a= array(
'one', 
'two', 
'three', 
'four' 
); 

Các tra cứu sau tất cả sẽ trở thành sự thật:

in_array('one', $a); 
in_array('two', $a); 
in_array('ONE', $a); 
in_array('fOUr', $a); 

chức năng gì hay tập hợp các chức năng sẽ làm như vậy? Tôi không nghĩ rằng chính bản thân mình có thể làm được điều này.

Trả lời

85

bạn có thể sử dụng preg_grep():

$a= array(
'one', 
'two', 
'three', 
'four' 
); 

print_r(preg_grep("/ONe/i" , $a)); 
+0

+1 gợi ý tốt – cletus

+1

Chắc chắn là giải pháp thanh lịch nhất. – Gazler

+33

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 –

41
function in_arrayi($needle, $haystack) { 
    return in_array(strtolower($needle), array_map('strtolower', $haystack)); 
} 

Nguồn: php.net in_array manual page.

+0

Nếu bạn biết những gì là trong mảng, bạn có thể bỏ qua array_map; nhưng đây là một ví dụ tốt. – Don

+2

Ai downvoted một ví dụ hoàn hảo tốt và giải pháp? –

+2

Tôi đã thực sự. Bởi vì ánh xạ mảng trên mọi cuộc gọi là, tốt, lố bịch. – cletus

165

Các điều hiển nhiên phải làm là chỉ cần chuyển đổi các thuật ngữ tìm kiếm thành chữ thường:

if (in_array(strtolower($word), $a) { 
    ... 

tất nhiên nếu có những chữ hoa trong mảng bạn sẽ cần phải thực hiện việc này trước tiên:

$search_array = array_map('strtolower', $a); 

và tìm kiếm điều đó. Không có điểm nào trong việc thực hiện strtolower trên toàn bộ mảng với mọi tìm kiếm.

Tuy nhiên, mảng tìm kiếm là tuyến tính. Nếu bạn có một mảng lớn hay bạn đang đi để làm điều này rất nhiều, nó sẽ là tốt hơn để đưa các thuật ngữ tìm kiếm trong chủ chốt của mảng như thế này sẽ nhiều nhanh hơn truy cập:

$search_array = array_combine(array_map('strtolower', $a), $a); 

sau đó

if ($search_array[strtolower($word)]) { 
    ... 

Vấn đề duy nhất ở đây là các khóa mảng phải là duy nhất vì vậy nếu bạn có va chạm (ví dụ "One" và "one"), bạn sẽ mất tất cả trừ một.

+14

Đây phải là câu trả lời được chấp nhận. Việc thêm các cụm từ thông dụng đôi khi chỉ gây ra 2 vấn đề. –

+1

Chẳng phải array_flip ở đây là giải pháp nhanh hơn, thay vì array_combine? $ search_array = array_flip (mảng_map ('strtolower', $ a)); –

+0

một dòng: in_array (strtolower ($ word), mảng_map ('strtolower', $ array)) – Andrew

89
function in_arrayi($needle, $haystack) { 
    return in_array(strtolower($needle), array_map('strtolower', $haystack)); 
} 

Từ Documentation

+2

Bạn nên chặn mã (hoặc bất kỳ thứ gì thực sự) bạn nhận được từ nơi khác. – cletus

+21

Tôi nhận thấy rằng 'Từ Tài liệu' với một liên kết sẽ là đủ ... –

+1

Chỉ cần rõ ràng. Nó không phải là một lời chỉ trích. Chỉ là một gợi ý (và chỉ có ý kiến ​​của tôi, không có gì chính thức). :) Ít nhất nếu tôi sao chép đoạn mã từ một trang, tôi sẽ chặn trích dẫn đoạn trích đó. – cletus

2

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; 
    } 
} 
} 
0
$a = [1 => 'funny', 3 => 'meshgaat', 15 => 'obi', 2 => 'OMER']; 

$b = 'omer'; 

function checkArr($x,$array) 
{ 
    $arr = array_values($array); 
    $arrlength = count($arr); 
    $z = strtolower($x); 

    for ($i = 0; $i < $arrlength; $i++) { 
     if ($z == strtolower($arr[$i])) { 
      echo "yes"; 
     } 
    } 
}; 

checkArr($b, $a); 
+0

Vui lòng thêm một descriptioin của giải pháp bạn đang đề xuất. –

1

Tôi đã viết một chức năng đơn giản để kiểm tra một giá trị không nhạy cảm trong một mảng các mã dưới đây.

chức năng:

function in_array_insensitive($needle, $haystack) { 
    $needle = strtolower($needle); 
    foreach($haystack as $k => $v) { 
     $haystack[$k] = strtolower($v); 
    } 
    return in_array($needle, $haystack); 
} 

làm thế nào để sử dụng:

$array = array('one', 'two', 'three', 'four'); 
var_dump(in_array_insensitive('fOUr', $array)); 
+0

Tôi thích giải pháp này, +1 phiếu bầu –

7

Giả sử bạn muốn sử dụng in_array, đây là cách bạn có thể làm cho trường hợp tìm kiếm không nhạy cảm.

Trường hợp không nhạy cảm in_array():

foreach($searchKey as $key => $subkey) { 

    if (in_array(strtolower($subkey), array_map("strtolower", $subarray))) 
    { 
     echo "found"; 
    } 

} 

trường hợp bình thường nhạy cảm:

foreach($searchKey as $key => $subkey) { 

if (in_array("$subkey", $subarray)) 

    { 
     echo "found"; 
    } 

} 
Các vấn đề liên quan