Menu

PHP in_array() : vérifier si une valeur est dans un tableau

in_array($needle, $haystack) renvoie true quand la valeur est dans le tableau. Passez true en troisième argument pour une vérification stricte, in_array('1', $ids, true), afin que les types doivent aussi correspondre. Le mode strict, la recherche insensible à la casse, vérifier plusieurs valeurs, les tableaux imbriqués et l'alternative rapide avec isset.

Cette page contient des éditeurs exécutables - modifiez, exécutez et voyez la sortie instantanément.

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.

Correspondances de in_array en mode souple (==) et strict (===)
Point at or tap a cell to read it as PHP.
$a == $btruefalsenull01"0""1""""abc""10""1e1"10[]
true
false
null
0
1
"0"
"1"
""
"abc"
"10"
"1e1"
10
[]
Every cell computed by PHP 8.3.19.

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 :

AppelRenvoieVitesse sur un grand tableau
in_array($v, $arr, true)true ou falseparcourt chaque élément
array_search($v, $arr, true)la clé, ou falseparcourt chaque élément
isset($set[$v])true ou falseune 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.

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER