Sano, että minulla on tällainen tietorakenne:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
Missä ”viesti” ja ”toiminto” ovat molemmat valinnaisia. Jos yritän tarkistaa, ovatko he ensimmäiset yritykseni, kirjoitan jotain tällaista:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
Onko olemassa puhtaampaa toteutusta?
Kommentit
- Katso myös: stackoverflow.com/questions/2948948/… Voit kirjoittaa array_key_exists-apufunktion, joka toimii rekursiivisesti.
Vastaa
Ei, tämä on vain tapa tehdä se.
Jopa silloin, kun en rajoitu tiettyyn komentokieleen, en voi ajatella puhtaampaa ratkaisua?
Vastaa
Voit vain tehdä tämän!
if (isset($array["message"]["action"])) { /*...*/ }
Todiste:
<?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
Ei lokimerkintöjä.
Huomaa, että jos arvo on null
, silloin myös setset palauttaa epätosi. Luultavasti sinun ei pitäisi luoda arvoja arvolla null
.
Kommentit
- Tästä vastauksesta puuttuu myös
)
ja se voi aiheuttaa lokimerkinnän luomisen, koskaisset($array['message'])
ennen kuin poistat sen käytöstä. - @Brythan no se ei aiheuta lokimerkintää. Mutta kyllä siitä puuttuu
)
. - Anteeksi, tarkoitin huomauttaa, että sinun on ' kampaa virheraportointia. Se aiheuttaa ehdottomasti lokimerkinnän, jos virheraportointi on asetettu sille. Minulla ' on ollut roskapostiani aiemmin. Tämä oli oletuskirjaus yhdessä vaiheessa. Se ei ehkä ole nyt oletusarvo (tai isäntäsi on ehkä valinnut virheraportoinnin), mutta olen täysin varma, että tämä tilanne voi luoda lokimerkinnän tietyissä kokoonpanoissa.
- Ei, se ei todellakaan ' t Testasin sen, että kaikki virheraportit olivat päällä!
Vastaa
Ei selkeämpi, mutta todennäköisesti nopein ratkaisu:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
Toinen tarkistus on tarpeen, koska jotkut arvot on arvioitu isset()
johtaa väärään, vaikka hakemisto on olemassa.
Vastaa
Käytän tätä omassa projektissani, mutta minä ” m käyttämällä mykistettynä tilana null
. (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; }
Se on toiminto, joka etsii path
puusta.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
Kuten näette. Minä silmukan arvoja matriisin yli: path
. Alussa asetan kohdistimen viitteeksi taulukkoon, josta minun on haettava. Joka kerta, kun löydän new
-avaimen, asetan kohdistimen viitteen nykyinen avain, jota etsin. Jos sinulla on xdebug
ja hyvä käyttöliittymä, voit kirjoittaa sen haluamaasi algoritmiin. Se on isset($cursor[$key])
sinun on muutettava. Tai pistää sen funktiona: f($cursor, $key, $default) => (bool)
Kommentit
- Olet antanut vaihtoehtoisen ratkaisun, mutta olet ei tarkistanut koodia. Lisää selitys siitä, miksi tämä olisi parempi ratkaisu OP: lle sen sijaan, mitä heillä jo on.
- Koska se ei ole ' t kirjoittanut voimakkaasti SirPythonia. Tällä tavoin voin testata sen yksikkötesteillä tekemättä yksikkötestiä jokaiselle ' kovakoodatulle merkkijonolle '. Joten täytyy tehdä testattavuuden ja nopeuden voin luoda toimivan koodin.
Vastaa
Etsitkö vastaavaa ratkaisun itse ja keksin tämän. Toimii selvittääkseen, onko avain asetettu ollenkaan – ja palauttaa TOSI-arvon, vaikka ”toiminto” -avaimen arvo olisi NULL.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
Jos $array["message"]
ei ole avaimia, isset
palauttaa FALSE pysäyttäen IF-käskyn. Jos $array["message"]
-laitteessa on avaimia – jopa NULL-arvoisia -, isset
palauttaa arvon TOSI, jolloin voit tarkistaa turvallisesti, onko ”6a163d47eb”>
taulukkoavain on kohdassa $array["message"]
.