Vérification de la clé existante dans le tableau multidimensionnel

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

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 de isset($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"].

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *