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
- Vedi anche: stackoverflow.com/questions/2948948/… Puoi scrivere una funzione di utilità array_key_exists che funzioni in modo ricorsivo.
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 controllatoisset($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"]
.