Spuneți că am o structură de date de genul acesta:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
În cazul în care „mesaj” și „acțiune” sunt ambele opționale. Pentru a verifica dacă „prezintă prima mea încercare ar fi să scriu ceva de genul acesta:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
Există o implementare mai curată?
Comentarii
- Vezi și: stackoverflow.com/questions/2948948/… Puteți scrie o funcție de utilitate array_key_exists care funcționează recursiv.
Răspuns
Nu, aceasta este doar modul de a face acest lucru.
Chiar și atunci când nu sunt limitat la un anumit limbaj de script, nu mă pot gândi la o soluție mai curată?
Răspuns
Puteți face acest lucru!
if (isset($array["message"]["action"])) { /*...*/ }
Dovadă:
<?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
Fără intrări de jurnal.
Rețineți că dacă valoarea dvs. este null
, atunci și setul va reveni fals. Probabil că nu ar trebui să creați valori cu null
.
Comentarii
- Acestui răspuns îi lipsește și un
)
și poate provoca generarea unei intrări de jurnal din cauza nerecuperăriiisset($array['message'])
înainte de a-l dereferenția. - @Brythan nu, nu provoacă o intrare în jurnal. Dar da, lipsește un
)
. - Ne pare rău, am vrut să subliniez că ' trebuie să crank raportarea erorilor. Provoacă absolut o intrare în jurnal dacă aveți setat raportarea erorilor pentru aceasta. ' am primit anterior spam-ul jurnalelor mele. Aceasta a fost înregistrarea implicită la un moment dat. Este posibil să nu fie implicit acum (sau este posibil ca gazda dvs. să fi redus raportarea erorilor), dar sunt absolut sigur că situația respectivă poate genera o intrare de jurnal în anumite configurații.
- Nu, chiar nu ' t L-am testat cu toate raportările de erori activate!
Răspuns
Nu este mai clar, dar probabil cea mai rapidă soluție:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
A doua verificare este necesară deoarece unele valori evaluate cu isset()
va rezulta fals, deși indexul există.
Răspuns
Eu „folosesc acest lucru într-un proiect al meu, dar eu” m folosind null
ca stare dezactivată. (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; }
Este „o funcție care va căuta un path
într-un copac.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
După cum puteți vedea. Mă buclez peste valorile dintr-o matrice: path
. La început, setez un cursor ca referință la o matrice pe care trebuie să o caut. De fiecare dată când găsesc o tastă new
, setez referința cursorului la cheia curentă pe care o caut. Dacă aveți xdebug
și o interfață grafică bună, o puteți rescrie în algoritmul dorit. Este isset($cursor[$key])
trebuie să te schimbi. Sau injectați-l ca o funcție: f($cursor, $key, $default) => (bool)
Comentarii
- Ați furnizat o soluție alternativă, dar ați nu a revizuit codul. Vă rugăm să adăugați explicații despre motivul pentru care aceasta ar fi o soluție mai bună pentru OP, mai degrabă decât ceea ce au deja.
- Deoarece nu este ' t SirPython puternic tastat. În acest fel îl pot testa cu teste unitare, fără a efectua un test unitar pentru fiecare ' hardcoded-string '. Așa trebuie și cu testabilitatea și viteza pe care o pot crea cod de lucru.
Răspuns
Am căutat un similar soluție eu și am venit cu asta. Funcționează pentru a determina dacă cheia este setată deloc – și va reveni ADEVĂRAT chiar dacă valoarea cheii „acțiune” este NULĂ.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
Dacă $array["message"]
nu are chei, isset
va returna FALSE oprind instrucțiunea IF. Dacă $array["message"]
are chei – chiar și cele cu valori NULL – isset
va reveni la TRUE, permițându-vă să verificați în siguranță dacă "action"
cheia matricei există în $array["message"]
.