Lorsque vous utilisez PHP pour les opérations du tableau, de nombreux développeurs sont confus par la fonction array_key_exists () , en particulier lorsque la valeur clé est nul , elle renvoie toujours vrai . La raison derrière cela est en fait étroitement liée au mécanisme de travail des tableaux PHP.
La fonction de array_key_exists () est de détecter si la clé spécifiée existe dans le tableau, plutôt que de détecter si la clé a une valeur . Cela signifie que tant que cette clé existe dans le tableau, quelle que soit sa valeur correspondante (même si elle est nul ), la fonction renvoie vrai .
$array = ['name' => null];
if (array_key_exists('name', $array)) {
echo 'La clé existe';
} else {
echo 'La clé n'existe pas';
}
La sortie du code ci-dessus sera:
La clé existe
En effet, le «nom» de la clé existe dans le tableau, bien que sa valeur soit nulle .
De nombreux débutants confondrent array_key_exists () et isset () , et leur comportement diffère lorsque la valeur est nul .
$array = ['name' => null];
var_dump(isset($array['name'])); // Sortir: bool(false)
var_dump(array_key_exists('name', $array)); // Sortir: bool(true)
isset () vérifie si la variable est définie et non nul . Donc, si la valeur d'une clé est null , Isset () reviendra false et array_key_exists () ne se souciera que si la clé existe, quelle que soit la valeur.
Cette différence de comportement est très importante dans les scénarios où les données de forme sont traitées, les demandes d'API, ou la nécessité de distinguer les "clés n'existent pas" et "les clés existent mais les valeurs sont vides". Par exemple:
// simulation JSON Demander un corps
$json = '{"username": null}';
$data = json_decode($json, true);
// Si l'utilisateur se soumet explicitement null valeur,array_key_exists Peut être identifié
if (array_key_exists('username', $data)) {
// traiter avec username,哪怕valeur为 null
} else {
// username Champ non soumis
}
Dans ce cas d'utilisation, si vous utilisez ISSet () pour détecter si le nom d'utilisateur existe, vous ne saurez pas si l'utilisateur est intentionnellement passé dans une valeur nulle , ce qui entraînera une ambiguïté dans certains jugements logiques.
Supposons que vous ayez un tableau de configuration:
$config = ['debug' => null];
if (isset($config['debug'])) {
echo 'Activer le mode de débogage';
}
Ce jugement échouera car isset () renvoie false lorsque la valeur est nul , mais en fait, vous voudrez peut-être simplement savoir si cette clé existe. Une approche plus précise devrait être:
if (array_key_exists('debug', $config)) {
echo 'Activer le mode de débogage';
}
Si vous souhaitez savoir si la clé existe et que vous souhaitez également traiter le contenu de la valeur, vous pouvez l'utiliser en combinaison avec les deux:
if (array_key_exists('token', $data)) {
if ($data['token'] !== null) {
// efficace token
$token = $data['token'];
} else {
// token Oui null,Réviation ou inviter une erreur peut être requise
}
} else {
// token Les champs ne sont pas du tout passés,可能Oui非法请求
}
Le comportement de array_key_exists () est conçu très raisonnablement: il se concentre sur l'existence de clés, et non sur l'état des valeurs. Comprendre cela est essentiel pour écrire des programmes PHP robustes.
Si vous devez confirmer en outre si une clé existe réellement dans le tableau pendant le débogage, même si sa valeur est nul , l'utilisation de l'array_key_exists () est le bon choix. Évitez la mauvaise utilisation ISSet () pour déterminer l'existence de clés, sinon vous pouvez ignorer les valeurs de clés qui sont explicitement définies sur NULL , ce qui est particulièrement sujet aux erreurs lorsqu'il s'agit d'une logique métier complexe (comme la conception de l'API de gitbox.net ).