Controllo della chiave esistente nellarray multidimensionale

Supponiamo che io abbia una struttura dati come questa:

array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } } 

Dove “messaggio” e “azione” sono entrambi opzionali. Per verificare se “sono presenti, il mio primo tentativo sarebbe scrivere qualcosa del genere:

if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ } 

Esiste unimplementazione più pulita?

Commenti

Answer

No, questo è solo il modo per farlo.

Anche quando “non sono limitato a un certo linguaggio di script, non riesco” a pensare a una soluzione più pulita?

Risposta

Puoi farlo!

if (isset($array["message"]["action"])) { /*...*/ } 

Prova:

<?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 

Nessuna voce di log.

Tieni presente che se il tuo valore è null, quindi anche isset restituirà false. Probabilmente non dovresti creare valori con null.

Commenti

  • In questa risposta manca anche un ) e potrebbe causare la generazione di una voce di log perché non viene controllato isset($array['message']) prima di dereferenziarlo.
  • @Brythan no non causa una voce di log. Ma sì, manca un ).
  • Mi spiace, volevo sottolineare che ' dovresti avvia la segnalazione degli errori. Causa assolutamente una voce di registro se hai impostato la segnalazione degli errori. ' ho ricevuto spam nei miei log con quello in precedenza. Questa era la registrazione predefinita a un certo punto. Potrebbe non essere limpostazione predefinita ora (o il tuo host potrebbe aver disattivato la segnalazione degli errori), ma sono assolutamente sicuro che quella situazione può generare una voce di log in determinate configurazioni.
  • No, davvero non ' t Lho testato con tutti i rapporti sugli errori attivati!

Risposta

Non più chiara ma probabilmente la soluzione più veloce:

if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ } 

Il secondo controllo è necessario perché alcuni valori valutati con isset() risulterà falso nonostante lindice esista.

Risposta

Lo sto usando in un mio progetto, ma io ” m utilizzando null come stato disattivato. (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; } 

È “una funzione che cercherà un path in un albero.

echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C"); 

Come puoi vedere. Sto scorrendo i valori su un array: path. Allinizio sto impostando un cursore come riferimento a un array in cui devo cercare. Ogni volta che trovo un tasto new, sto “impostando il riferimento del cursore al la chiave corrente che sto cercando. Se hai xdebug e una buona GUI, puoi riscriverla nellalgoritmo che desideri. È isset($cursor[$key]) devi cambiare. Oppure iniettalo come funzione: f($cursor, $key, $default) => (bool)

Commenti

  • Hai fornito una soluzione alternativa ma hai non rivisto il codice. Per favore aggiungi una spiegazione sul motivo per cui questa sarebbe una soluzione migliore per lOP, piuttosto che quello che hanno già.
  • Perché non è ' t fortemente tipizzato SirPython. In questo modo posso testarlo con unit test, senza fare uno unit test per ogni ' hardcoded-string '. Lo stesso vale per la testabilità e la velocità con cui posso creare codice funzionante.

Risposta

Stavo cercando un simile soluzione me stesso e ho trovato questo. Funziona per determinare se la chiave è impostata e restituirà TRUE anche se il valore della chiave “action” è NULL.

if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ } 

If $array["message"] non ha chiavi, isset restituirà FALSE interrompendo listruzione IF. Se $array["message"] ha chiavi, anche quelle con valori NULL, isset restituirà TRUE, consentendoti di controllare in sicurezza se "action" esiste in $array["message"].

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *