2010-01-30 10 views
93

Czy możliwe jest porównywanie wielkości liter w przypadku korzystania z funkcji in_array?Funkcja niewysłowionej wielkości liter w PHP

Więc z tablicy źródłowej tak:

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

Poniższe wyszukiwań że wszyscy zwracają prawdę:

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

jaką funkcję lub zestaw funkcji byłoby zrobić to samo? Nie sądzę, że sam może to zrobić.

Odpowiedz

85

można użyć preg_grep():

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

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

+1 dobra sugestia – cletus

+1

Zdecydowanie najbardziej eleganckie rozwiązanie. – Gazler

+33

używanie wyrażeń regularnych nie jest dobrym rozwiązaniem, ponieważ może być powolne ... może array_map jest szybsze –

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

Źródło: php.net in_array manual page.

+0

Jeśli wiesz, co jest w tablicy można pominąć array_map; ale to jest dobry przykład. – Don

+2

Kto zniósł doskonały przykład i rozwiązanie? –

+2

Zrobiłem to. Ponieważ mapowanie tablicy przy każdym wywołaniu jest niedorzeczne. – cletus

165

Oczywistą rzeczą do zrobienia jest tylko konwertować wyszukiwany termin na małe litery:

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

oczywiście jeśli istnieją duże litery w tablicy trzeba zrób to najpierw:

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

i wyszukaj to. Nie ma sensu robić strtolower w całej tablicy przy każdym wyszukiwaniu.

Wyszukiwanie tablic jest jednak liniowe. Jeśli masz dużą tablicę lub masz zamiar to zrobić dużo, lepiej byłoby umieścić wyszukiwane w kluczu tablicy, jak to będzie znacznie szybszy dostęp:

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

następnie

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

Jedynym problemem jest to, że klucze tablicowe muszą być unikalne, więc w przypadku kolizji (np. "Jeden" i "jeden") stracisz wszystkie oprócz jednego.

+14

To powinna być zaakceptowana odpowiedź. Dodanie wyrażeń regularnych czasami powoduje 2 problemy. –

+1

Czy zamiast tego array_flip byłoby jeszcze szybszym rozwiązaniem, zamiast array_combine? $ search_array = array_flip (array_map ('strtolower', $ a)); –

+0

Jedna linia: in_array (strtolower ($ word), array_map ('strtolower', $ array)) – Andrew

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

Od Documentation

+2

Powinieneś zablokować kod (lub cokolwiek naprawdę), który otrzymasz z innego miejsca. – cletus

+21

Doszedłem do wniosku, że "Z dokumentacji" z linkiem będzie wystarczające ... –

+1

Po prostu, aby było jasne. To nie jest krytyka. Tylko sugestia (i tylko moja opinia, nic oficjalnego). :) Przynajmniej jeśli skopiuję fragment kodu ze strony, będę go zacytować. – cletus

2

powyżej jest poprawne, jeśli założymy, że tablice mogą zawierać tylko struny, ale tablice mogą zawierać inne tablice, jak również. Również funkcja in_array() może przyjąć tablicę dla $ needle, więc strtolower ($ needle) nie zadziała, jeśli $ needle jest tablicą, a array_map ('strtolower', $ haystack) nie zadziała, jeśli $ haystack zawiera inne tablice, ale spowoduje "ostrzeżenie PHP: strtolower() oczekuje, że parametr 1 będzie łańcuchem, tablica podana".

Przykład:

$needle = array('p', 'H'); 
$haystack = array(array('p', 'H'), 'U'); 

Więc stworzyłem klasę pomocnika z metod releveant, aby wielkość liter i bez uwzględniania wielkości liter in_array() sprawdza. Używam również mb_strtolower() zamiast strtolower(), więc inne kodowania mogą być używane. Oto kod:

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

Dodaj opis deskrypcji proponowanego rozwiązania. –

1

napisałem prostą funkcję do sprawdzenia wartości niewrażliwego na tablicy kod znajduje się poniżej.

funkcja:

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

sposób użycia:

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

Podoba mi się to rozwiązanie, +1 głos –

7

Powiedzmy, że chcesz użyć in_array, oto jak można zrobić w przypadku wyszukiwania nieczuły.

Case niewrażliwy in_array():

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

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

} 

Normalna wielkość liter:

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

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

    { 
     echo "found"; 
    } 

} 
Powiązane problemy