array_key_exists('key', $array) renvoie true si le tableau a cette clé et false sinon. Attention à l'ordre : la clé d'abord, le tableau ensuite. Elle renvoie true même quand la valeur rangée sous la clé vaut null, la seule chose que isset() ne fait pas.
Pour vérifier une valeur plutôt qu'une clé, utilisez in_array().
array_key_exists ou isset
Les deux vérifient une clé. Elles ne divergent que quand la valeur vaut null : isset() traite une valeur null comme « non définie », array_key_exists() indique ce qui se trouve vraiment dans le tableau.
0 et '' comptent comme définies pour les deux ; seul null les sépare. Le bon choix dépend de ce que signifie null dans vos données :
- Utilisez
isset()quandnullsignifie « pas de valeur ». C'est le cas courant, c'est une construction du langage (un peu plus rapide), et elle accepte les chemins imbriqués et les variables non définies sans warning. - Utilisez
array_key_exists()quandnullest une vraie valeur à distinguer d'une clé absente : un champ JSON envoyé ànull, une colonne de base de données àNULL, une option explicitement mise ànullpour l'effacer.
La page isset couvre ses autres usages, y compris la vérification de plusieurs variables à la fois.
Distinguer null d'une absence dans du JSON
Un cas typique où seule array_key_exists() donne la bonne réponse : une API qui met à jour un enregistrement à partir de JSON. Un champ envoyé à null signifie « l'effacer », un champ absent signifie « ne pas y toucher ». isset() voit les deux comme identiques.
Avec isset($patch[$field]), le numéro de téléphone resterait, car le null ressemblerait à un champ absent.
key_exists() est la même fonction
key_exists() est un alias de array_key_exists(), conservé depuis les débuts de PHP. Mêmes arguments, même résultat. Préférez le nom complet, celui que les lecteurs s'attendent à voir.
Types de clés : "1" et 1 sont la même clé
Les clés de tableau sont des entiers ou des chaînes, et une chaîne qui est un simple entier décimal est stockée comme un entier. Donc array_key_exists('1', $arr) trouve la clé 1, et inversement. Une chaîne comme '01' reste une chaîne et c'est une clé différente.
Vérifier des clés imbriquées et plusieurs clés
array_key_exists() regarde un seul niveau. Pour un chemin imbriqué où null ne compte pas, isset($a['x']['y']) vérifie tous les niveaux d'un coup. Pour un chemin où il compte, une petite fonction parcourt les niveaux. Pour vérifier que plusieurs clés sont toutes présentes, comparez avec array_diff_key().
array_flip($required) transforme la liste de noms en clés pour que array_diff_key() puisse les comparer aux clés de l'entrée ; ce qui reste est la liste des champs manquants, prête pour un message d'erreur.
Les objets demandent property_exists
Les anciennes versions de PHP acceptaient un objet dans array_key_exists(). PHP 8 lève une TypeError à la place. Pour les objets, property_exists() vérifie une propriété déclarée ou dynamique (même mise à null), et isset($obj->prop) fonctionne comme isset() sur les tableaux.
Les deux dernières lignes montrent l'autre voie : get_object_vars() transforme les propriétés accessibles de l'objet en tableau, et les fonctions de tableau s'appliquent ensuite.
Questions fréquentes
Pourquoi isset renvoie-t-il false quand array_key_exists renvoie true ?
La clé contient null. isset($arr['k']) ne vaut true que si la clé existe et que sa valeur ne vaut pas null, alors que array_key_exists('k', $arr) vaut true dès que la clé est dans le tableau. Pour toute autre valeur, y compris 0, '' et false, les deux donnent la même réponse.
Qu'est-ce que key_exists en PHP ?
Un alias de array_key_exists(). key_exists('id', $row) et array_key_exists('id', $row) se comportent de la même façon. La plupart du code utilise le nom long.
Comment vérifier si une clé imbriquée existe en PHP ?
Vérifiez chaque niveau : isset($data['user']['address']['city']) vérifie tout le chemin d'un coup et n'affiche jamais de warning quand un niveau manque. Si les valeurs null doivent compter comme présentes, parcourez le chemin avec array_key_exists() niveau par niveau.
Peut-on utiliser array_key_exists sur un objet ?
Non. Depuis PHP 8.0, passer un objet lève une TypeError. Utilisez property_exists($obj, 'name') pour les propriétés déclarées, ou isset($obj->name).