Est-il possible de faire une comparaison insensible à la casse lors de l'utilisation de la in_array
fonction?
Donc, avec un tableau source comme celui-ci:
$a= array(
'one',
'two',
'three',
'four'
);
Les recherches suivantes renverraient toutes true:
in_array('one', $a);
in_array('two', $a);
in_array('ONE', $a);
in_array('fOUr', $a);
Quelle fonction ou quel ensemble de fonctions ferait de même? Je ne pense pas qu'elle in_array
puisse faire ça.
count(preg_grep('/^'.preg_quote($needle).'/$',$a)>0)
. Pas si élégant, alors. (Notez que les caractères ^ et $ sont obligatoires, sauf si une correspondance partielle est souhaitée.) Cependant, si vous voulez réellement que les entrées correspondantes soient renvoyées, j'aime cette solution.La chose évidente à faire est simplement de convertir le terme de recherche en minuscules:
bien sûr, s'il y a des lettres majuscules dans le tableau, vous devrez d'abord le faire:
et recherchez cela. Il ne sert à rien de faire
strtolower
sur l'ensemble du tableau à chaque recherche.La recherche de tableaux est cependant linéaire. Si vous avez un grand tableau ou que vous comptez faire beaucoup cela, il serait préférable de mettre les termes de recherche dans la clé du tableau car ce sera un accès beaucoup plus rapide:
puis
Le seul problème ici est que les clés de tableau doivent être uniques, donc si vous avez une collision (par exemple "One" et "one"), vous en perdrez toutes sauf une.
la source
De la documentation
la source
>
à chaque ligne, cela fonctionne. Je suis juste habitué à mettre manuellement le>
en première ligne.>
au début de chaque ligne.Source: page de manuel de php.net in_array.
la source
Supposons que vous souhaitiez utiliser in_array, voici comment rendre la recherche insensible à la casse.
Insensible à la casse in_array ():
Normalement sensible à la casse:
la source
Ce qui précède est correct si nous supposons que les tableaux ne peuvent contenir que des chaînes, mais que les tableaux peuvent également contenir d'autres tableaux. La fonction in_array () peut également accepter un tableau pour $ aiguille, donc strtolower ($ aiguille) ne fonctionnera pas si $ aiguille est un tableau et array_map ('strtolower', $ haystack) ne fonctionnera pas si $ haystack contient d'autres tableaux, mais entraînera un "avertissement PHP: strtolower () s'attend à ce que le paramètre 1 soit une chaîne, tableau donné".
Exemple:
J'ai donc créé une classe d'assistance avec les méthodes pertinentes, pour faire des vérifications in_array () sensibles à la casse et insensibles à la casse. J'utilise également mb_strtolower () au lieu de strtolower (), donc d'autres encodages peuvent être utilisés. Voici le code:
la source
J'ai écrit une fonction simple pour vérifier une valeur insensible dans un tableau dont le code est ci-dessous.
fonction:
comment utiliser:
la source
la source
return
. Lorsqu'il suffit de trouver 1 aiguille, il est inutile de continuer à itérer après l'avoir trouvée. Je corrigerais une faute de frappe, utiliserais le concept $ strict et apporterais quelques améliorations, peut-être quelque chose de proche de 3v4l.org/WCTi2 . Ce message n'est pas parfait, mais son cœur est au bon endroit.la source
$ a = tableau ('un', 'deux', 'trois', 'quatre');
$ b = in_array ('ONE', $ a, faux);
la source
true
des comparaisons de type strictes seront utilisées, par exemple'1' !== 1
. Lorsque lafalse
jonglerie de type sera utilisée, par exemple'1' == 1
. Voir php.net/in_array et php.net/manual/en/types.comparisons.php pour la documentation.