Menu

PHP array_key_exists() : vérifier si une clé existe

array_key_exists('key', $array) renvoie true quand le tableau a cette clé, même si sa valeur est null. isset($array['key']) est plus rapide mais renvoie false pour une valeur null. La différence, key_exists(), les clés imbriquées, vérifier plusieurs clés, et pourquoi les objets demandent property_exists().

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

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() quand null signifie « 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() quand null est 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 à null pour 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).

Illustration des langages de programmation de Coddy

Apprendre à coder avec Coddy

COMMENCER