Sig, at jeg har en datastruktur som denne:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
Hvor “meddelelse” og “handling” begge er valgfri. At kontrollere, om de “præsenterer mit første forsøg, ville være at skrive noget som dette:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
Er der en renere implementering?
Kommentarer
- Se også: stackoverflow.com/questions/2948948/… Du kan skrive en array_key_exists-funktion, der fungerer rekursivt.
Svar
Nej, dette er bare måden at gøre det på.
Selv når jeg ikke er begrænset til et bestemt script-sprog, kan jeg ikke tænke på en renere løsning?
Svar
Du kan bare gø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 logposter.
Vær opmærksom på, at hvis din værdi er null
, så returnerer isset også falsk. Du bør sandsynligvis ikke oprette værdier med null
.
Kommentarer
- Dette svar mangler også en
)
og kan medføre, at der oprettes en logindgang, fordiisset($array['message'])
inden der refereres til det. - @Brythan nej, det forårsager ikke en logindgang. Men ja, det mangler en
)
. - Undskyld, jeg mente at påpege, at du ' d skulle krank din fejlrapportering. Det forårsager absolut en logindgang, hvis du har indstillet din fejlrapportering. Jeg ' har fået det til at spam mine logfiler med det tidligere. Dette var standardlogning på et tidspunkt. Det er muligvis ikke standard nu (eller din vært har muligvis ringet op til fejlrapportering), men jeg er helt sikker på, at den situation kan generere en logindgang under bestemte konfigurationer.
- Nej det gør det virkelig ikke ' t Jeg testede det med al fejlrapportering slået til!
Svar
Ikke klarere, men sandsynligvis den hurtigste løsning:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
Den anden kontrol er nødvendig, fordi nogle værdier evalueres med isset()
vil resultere i falsk, selvom indekset findes.
Svar
Jeg bruger dette i et af mine projekter, men jeg ” m ved hjælp af null
som en dæmpet 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 funktion, der vil slå et path
i et træ.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
Som du kan se. Jeg løber over værdierne over en matrix: path
. I begyndelsen indstiller jeg en markør som reference til et array, jeg skal søge i. Hver gang jeg finder en new
-tast, sætter jeg markørens reference til nuværende nøgle jeg søger efter. Hvis du har xdebug
og en god GUI, kan du omskrive den til den ønskede algoritme. Det er isset($cursor[$key])
du er nødt til at ændre. Eller indsprøjt det som en funktion: f($cursor, $key, $default) => (bool)
Kommentarer
- Du har leveret en alternativ løsning, men har ikke gennemgået koden. Tilføj venligst forklaring på, hvorfor dette ville være en bedre løsning for OP, snarere end hvad de allerede har.
- Fordi det ikke er ' t stærkt skrevet SirPython. På denne måde kan jeg teste det med enhedstest uden at lave en enhedstest for hver ' hardcoded-string '. Så har det med testbarhed og den hastighed, jeg kan oprette arbejdskode.
Svar
Leder du efter et lignende løsning selv og kom på dette. Fungerer for at afgøre, om nøglen overhovedet er indstillet – og vil returnere SAND, selv om værdien for “handling” -tasten er NULL.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
Hvis $array["message"]
har ingen nøgler, isset
returnerer FALSE og stopper IF-sætningen. Hvis $array["message"]
har nogen nøgler – selv dem med NULL-værdier – isset
returnerer SAND, så du sikkert kan kontrollere, om "action"
arraynøgle findes i $array["message"]
.