146 votes

PHP de la casse de la fonction in_array

Est-il possible de faire de comparaison sensible à la casse lors de l'utilisation de l' in_array fonction?

Donc, avec une source de tableau comme ceci:

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

La suite des recherches seraient toutes renvoient true:

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

Quelle est la fonction ou l'ensemble des fonctions serait de faire la même chose? Je ne pense pas qu' in_array lui-même peut le faire.

263voto

cletus Points 276888

La chose évidente à faire est de simplement convertir le terme de recherche en lettres minuscules:

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

bien sûr, si il y a des majuscules dans le tableau que vous aurez besoin pour ce faire d'abord:

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

et de la recherche. Il n'y a pas lieu de le faire strtolower sur l'ensemble du tableau avec chaque recherche.

La recherche des tableaux, cependant, est linéaire. Si vous avez un grand tableau ou vous allez faire beaucoup de choses, il serait mieux de mettre les termes de recherche dans les principaux de la matrice comme ce sera beaucoup plus rapide d'accès:

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

alors

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

Le seul problème ici est que la matrice de touches doit être unique, donc si vous avez une collision (par exemple "Un" et "un"), vous perdrez tous, mais un seul.

127voto

Tyler Carter Points 30030
function in_arrayi($needle, $haystack) {
    return in_array(strtolower($needle), array_map('strtolower', $haystack));
}

De Documenation

108voto

ghostdog74 Points 86060

vous pouvez utiliser preg_grep():

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

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

53voto

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

Source: php.net in_array page de manuel.

3voto

Alex Points 1

Le ci-dessus est correcte, si nous supposons que les tableaux peuvent contenir uniquement des chaînes, mais les tableaux peuvent contenir d'autres tableaux. Aussi in_array() la fonction peut accepter un tableau $de l'aiguille, de sorte strtolower($aiguille) n'est pas d'aller travailler si $needle est un tableau et array_map('strtolower', $botte de foin) n'est pas d'aller travailler si $botte de foin contient d'autres tableaux, mais dans "PHP warning: strtolower() s'attend à ce paramètre 1 pour être string, array donné".

Exemple: $needle = array('p', 'H'); $botte de foin = array(array('p', 'H'), 'U');

J'ai donc créé une classe d'assistance avec les méthodes pertinentes, à les rendre sensibles à la casse et casse in_array() vérifie. Je suis également en utilisant mb_strtolower() au lieu de strtolower(), de sorte que les autres codages peuvent être utilisés. Voici le code:

classe 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;
    }
}

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X