Disons que jai une structure de données comme celle-ci:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
Où « message » et « action » sont tous deux facultatifs. Pour vérifier sils « sont présents, ma première tentative serait décrire quelque chose comme ceci:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
Y a-t-il une implémentation plus propre?
Commentaires
- Voir aussi: stackoverflow.com/questions/2948948/… Vous pouvez écrire une fonction utilitaire array_key_exists qui fonctionne de manière récursive.
Réponse
Non, ceci est juste la manière de le faire.
Même si je ne suis pas limité à un certain langage de script, je ne peux pas penser à une solution plus propre?
Réponse
Vous pouvez simplement le faire!
if (isset($array["message"]["action"])) { /*...*/ }
Preuve:
<?php error_reporting(E_ALL); ini_set("error_reporting", E_ALL); ini_set("display_errors", 1); $array = [ "id" => 1, "name" => "foo", "message" => [ "action" => "PUT", ], ]; var_dump(isset($array["message"]["action"])); // true $array = [ "id" => 1, "name" => "foo" ]; var_dump(isset($array["message"]["action"])); // false
Aucune entrée de journal.
Notez que si votre valeur est null
, puis isset renverra également false. Vous ne devriez probablement pas créer de valeurs avec null
.
Commentaires
- Il manque également un
)
dans cette réponse et peut entraîner la création dune entrée de journal en raison de la non-vérification deisset($array['message'])
avant de le déréférencer. - @Brythan non cela ne provoque pas dentrée de journal. Mais oui, il manque un
)
. - Désolé, je voulais signaler que vous ' devez lancez votre rapport derreur. Cela provoque absolument une entrée de journal si vous avez défini votre rapport derreurs. Jai ' avoir spammé mes journaux avec cela auparavant. Cétait la journalisation par défaut à un moment donné. Ce nest peut-être pas la valeur par défaut maintenant (ou votre hôte a peut-être composé un rapport derreur), mais je suis absolument sûr que cette situation peut générer une entrée de journal sous certaines configurations.
- Non, ce nest vraiment pas le cas ' t Je lai testé avec tous les rapports derreurs activés!
Réponse
Pas plus clair mais probablement la solution la plus rapide:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
La deuxième vérification est nécessaire car certaines valeurs évaluées avec isset()
sera faux bien que lindex existe.
Réponse
Jutilise ceci dans un de mes projets, mais je » m en utilisant null
comme état muet. (php 5.6)
<?php function &option_select($options, $default, ...$path) { if(!isset($path[0])) { return $options; } $cursor = &$options; foreach($path as $key) { if(isset($cursor[$key])) { $cursor = &$cursor[$key]; } else { return $default; } } return $cursor; }
Cest « une fonction qui recherchera un path
dans un arbre.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
Comme vous pouvez le voir. Je « m boucle sur les valeurs sur un tableau: path
. Au début, je « m place un curseur comme référence à un tableau dans lequel je dois chercher. Chaque fois que je trouve une touche new
, je » m mets la référence du curseur sur le clé actuelle que je recherche. Si vous avez xdebug
et une bonne interface graphique, vous pouvez la réécrire dans lalgorithme de votre choix. Cest le isset($cursor[$key])
vous devez changer. Ou injectez-le en tant que fonction: f($cursor, $key, $default) => (bool)
Commentaires
- Vous avez fourni une solution alternative mais vous avez pas examiné le code. Veuillez ajouter une explication sur la raison pour laquelle ce serait une meilleure solution pour lOP, plutôt que ce quils ont déjà.
- Parce quil nest ' fortement typé SirPython. De cette façon, je peux le tester avec des tests unitaires, sans faire de test unitaire pour chaque ' hardcoded-string '. Il en va de même avec la testabilité et la rapidité avec laquelle je peux créer du code de travail.
Réponse
Je cherchais un code similaire solution moi-même et est venu avec cela. Fonctionne pour déterminer si la clé est définie du tout – et retournera TRUE même si la valeur de la clé « action » est NULL.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
Si $array["message"]
na pas de clé, le isset
retournera FALSE arrêtant linstruction IF. Si $array["message"]
a des clés – même celles avec des valeurs NULL – isset
retournera TRUE, vous permettant de vérifier en toute sécurité si le "action"
une clé de tableau existe dans $array["message"]
.