in_array($needle, $haystack) renvoie true si la valeur se trouve quelque part dans le tableau et false sinon. Passez true en troisième argument, in_array($needle, $haystack, true), pour exiger aussi le même type ; c'est cette forme stricte qu'il faut utiliser par défaut.
in_array() ne regarde que les valeurs. Pour vérifier si une clé existe, utilisez array_key_exists() ou isset().
Le paramètre strict
Sans le troisième argument, in_array() compare avec ==, qui convertit les types avant de comparer. Avec true, elle compare avec === : la valeur et le type doivent correspondre tous les deux. La différence apparaît dès que le tableau mélange nombres et chaînes, ce qui est courant avec des données venant de formulaires, d'URL ou de fichiers CSV.
Chaque case ci-dessous indique ce que == et === renvoient pour cette paire de valeurs en PHP 8.3. in_array() répond true si l'aiguille et un élément donnent true dans le tableau pour le mode utilisé. Basculez entre les onglets et regardez les lignes null, true et chaînes numériques.
| $a == $b | true | false | null | 0 | 1 | "0" | "1" | "" | "abc" | "10" | "1e1" | 10 | [] |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| true | |||||||||||||
| false | |||||||||||||
| null | |||||||||||||
| 0 | |||||||||||||
| 1 | |||||||||||||
| "0" | |||||||||||||
| "1" | |||||||||||||
| "" | |||||||||||||
| "abc" | |||||||||||||
| "10" | |||||||||||||
| "1e1" | |||||||||||||
| 10 | |||||||||||||
| [] |
Une règle a changé en PHP 8 : une chaîne non numérique n'est plus égale à 0, donc in_array('abc', [0]) vaut false aujourd'hui mais valait true en PHP 7. Du code écrit pour PHP 7 en dépendait parfois, raison de plus pour passer true et ne pas dépendre des règles de conversion. La page des opérateurs de comparaison les explique en détail.
in_array insensible à la casse
in_array() compare les chaînes exactement, donc 'PHP' et 'php' sont différentes. Mettez en minuscules l'aiguille et le tableau avant de vérifier. mb_strtolower() gère aussi les lettres accentuées et non latines.
Vérifier plusieurs valeurs à la fois
in_array() prend une seule aiguille. Pour plusieurs, comparez les tableaux comme des ensembles : array_diff() renvoie les aiguilles manquantes, donc un résultat vide signifie qu'elles sont toutes présentes, et array_intersect() renvoie les aiguilles trouvées.
array_diff() et array_intersect() comparent les valeurs comme des chaînes, donc 1 et '1' y comptent comme égaux.
in_array sur un tableau multidimensionnel
in_array() ne cherche pas dans les tableaux imbriqués. Pour vérifier si une ligne a un champ avec une valeur donnée, extrayez d'abord ce champ avec array_column(), puis cherchez dans la liste à plat.
La dernière ligne montre que l'aiguille peut elle-même être un tableau : elle correspond à une ligne identique, mêmes clés, mêmes valeurs et même ordre.
in_array, array_search ou isset
Les trois répondent à « est-ce présent ? », mais renvoient des choses différentes et ne vont pas à la même vitesse :
| Appel | Renvoie | Vitesse sur un grand tableau |
|---|---|---|
in_array($v, $arr, true) | true ou false | parcourt chaque élément |
array_search($v, $arr, true) | la clé, ou false | parcourt chaque élément |
isset($set[$v]) | true ou false | une recherche dans une table de hachage |
Utilisez array_search() quand vous devez savoir où se trouve la valeur. Quand vous vérifiez beaucoup de valeurs dans la même grande liste, inversez la liste une fois pour que ses valeurs deviennent des clés, et utilisez isset().
Les temps changent d'une exécution à l'autre, mais l'écart reste : la recherche avec isset() reste constante alors que in_array() grandit avec la taille de la liste. array_flip() ne fonctionne que pour des valeurs de type chaîne ou entier, et les doublons fusionnent en une seule clé, ce qui ne gêne pas pour un test d'appartenance.
Questions fréquentes
À quoi sert le troisième paramètre de in_array ?
Il active la comparaison stricte. in_array($x, $arr, true) compare avec ===, donc le type doit correspondre en plus de la valeur : in_array('1', [1, 2], true) vaut false. Sans lui, PHP compare avec == et convertit d'abord les types.
Faut-il toujours utiliser le mode strict avec in_array ?
En général, oui. Le mode souple fait renvoyer true à in_array(null, [0]), in_array(true, ['any string']) et in_array('1e1', ['10']). Ne le désactivez que si vous voulez volontairement que '5' venant d'un formulaire corresponde à l'entier 5.
Comment rendre in_array insensible à la casse ?
Mettez les deux côtés en minuscules : in_array(strtolower($needle), array_map('strtolower', $haystack), true). Utilisez mb_strtolower quand le texte peut contenir des lettres non ASCII.
Comment vérifier si plusieurs valeurs sont dans un tableau ?
Pour les exiger toutes, vérifiez qu'il ne reste rien : !array_diff($needles, $haystack). Pour en exiger au moins une, vérifiez qu'il y a une intersection : (bool) array_intersect($needles, $haystack).
in_array est-elle lente ?
Elle parcourt le tableau élément par élément, elle est donc lente pour de grands tableaux vérifiés de nombreuses fois. Inversez le tableau une fois avec $set = array_flip($haystack); et utilisez isset($set[$value]), qui est une seule recherche dans une table de hachage.