Moniulotteisen taulukon olemassa olevan avaimen tarkistaminen

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

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *