Ser etter eksisterende nøkkel i flerdimensjonalt array

Si at jeg har en datastruktur slik:

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

Hvor «melding» og «handling» begge er valgfrie. Å sjekke om de «presenterer mitt første forsøk, ville være å skrive noe sånt som dette:

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

Er det en renere implementering?

Kommentarer

Svar

Nei, dette er bare måten å gjøre det på.

Selv når jeg ikke er begrenset til et bestemt skriptspråk, kan jeg ikke tenke på en renere løsning?

Svar

Du kan bare gjøre dette!

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

Bevis:

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

Ingen loggoppføringer.

Vær oppmerksom på at hvis verdien din er null, så vil isset også returnere false. Du burde sannsynligvis ikke lage verdier med null.

Kommentarer

  • Dette svaret mangler også en ) og kan føre til at en loggoppføring genereres på grunn av at isset($array['message']) før dere refererer til den.
  • @Brythan nei, det fører ikke til en loggoppføring. Men ja det mangler en ).
  • Beklager, jeg mente å påpeke at du ' d må sveiv feilrapporteringen. Det fører absolutt til en loggoppføring hvis du har angitt feilrapportering for den. Jeg har ' spammet loggene mine med det tidligere. Dette var standard loggføring på ett tidspunkt. Det er kanskje ikke standardverdien nå (eller verten din har slått ned feilrapportering), men jeg er helt sikker på at den situasjonen kan generere en loggoppføring under visse konfigurasjoner. = «aa107bbcf8″>

t Jeg testet den med all feilrapportering slått på!

Svar

Ikke klarere, men sannsynligvis den raskeste løsningen:

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

Den andre kontrollen er nødvendig fordi noen verdier evaluert med isset() vil føre til falsk til tross for at indeksen eksisterer.

Svar

Jeg bruker dette i et prosjekt av meg, men jeg » m bruker null som dempet tilstand. (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; } 

Det er en funksjon som vil slå opp en path i et tre.

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

Som du kan se. Jeg løper over verdiene over en matrise: path. I begynnelsen setter jeg en markør som referanse til en matrise jeg må søke i. Hver gang jeg finner en new -tast, setter jeg referansen til markøren til nåværende nøkkel jeg søker etter. Hvis du har xdebug og en god GUI, kan du skrive den om til algoritmen du vil ha. Det er isset($cursor[$key]) du må endre. Eller injiser det som en funksjon: f($cursor, $key, $default) => (bool)

Kommentarer

  • Du har gitt en alternativ løsning, men har ikke vurdert koden. Vennligst legg til forklaring på hvorfor dette ville være en bedre løsning for OP, i stedet for hva de allerede har.
  • Fordi det ikke er ' t skrev SirPython sterkt. På denne måten kan jeg teste det med enhetstester, uten å lage en enhetstest for hver ' hardkodet streng '. Så har med testbarhet og hastigheten jeg kan lage arbeidskode.

Svar

Leter etter et lignende løsning selv og kom på dette. Fungerer for å avgjøre om nøkkelen er satt i det hele tatt – og vil returnere SANT selv om verdien til «handling» -tasten er NULL.

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

Hvis $array["message"] har ingen nøkler, isset returnerer FALSE og stopper IF-setningen. Hvis $array["message"] har noen nøkler – selv de med NULL-verdier – vil isset returnere SANT, slik at du trygt kan sjekke om "action" arraynøkkel finnes i $array["message"].

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *