Letar efter befintlig nyckel i flerdimensionell array

Säg att jag har en datastruktur så här:

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

Där ”meddelande” och ”åtgärd” båda är valfria. Att kontrollera om de ”presenterar mitt första försök skulle vara att skriva något så här:

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

Finns det en renare implementering?

Kommentarer

Svar

Nej, det här är bara sättet att göra det.

Även när jag inte är begränsad till ett visst skriptspråk kan jag inte tänka mig en renare lösning?

Svar

Du kan bara göra det här!

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 

Inga loggposter.

Observera att om ditt värde är null, då kommer isset också att returnera falskt. Du borde antagligen inte skapa värden med null.

Kommentarer

  • Det här svaret saknas också en ) och kan orsaka att en loggpost skapas på grund av att isset($array['message']) innan du refererar till den.
  • @Brythan nej det orsakar inte en loggpost. Men ja det saknas en ).
  • Ledsen, jag menade att påpeka att du ' d måste vev din felrapportering. Det orsakar absolut en loggpost om du har din felrapportering inställd för den. Jag ' har fått det att skräpposta mina loggar med det tidigare. Detta var standardloggningen vid ett tillfälle. Det kanske inte är standard nu (eller din värd kan ha ringt upp felrapportering), men jag är helt säker på att den situationen kan generera en loggpost under vissa konfigurationer.
  • Nej det verkligen inte ' t Jag testade det med all felrapportering påslagen!

Svar

Inte tydligare men förmodligen den snabbaste lösningen:

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

Den andra kontrollen behövs eftersom vissa värden utvärderas med isset() kommer att bli falskt trots att indexet finns.

Svar

Jag använder det här i ett projekt av mig, men jag ” m använder null som ett tyst tillstånd. (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 är en funktion som söker upp en path i ett träd.

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

Som du kan se. Jag går över värdena över en matris: path. I början ställer jag in en markör som referens till en matris som jag måste söka i. Varje gång jag hittar en new -tangent ställer jag in referens för markören till nuvarande nyckel jag söker efter. Om du har xdebug och ett bra GUI kan du skriva om det till den algoritm du vill ha. Det är isset($cursor[$key]) du måste ändra. Eller injicera det som en funktion: f($cursor, $key, $default) => (bool)

Kommentarer

  • Du har tillhandahållit en alternativ lösning men har inte granskat koden. Lägg till en förklaring om varför detta skulle vara en bättre lösning för OP, snarare än vad de redan har.
  • Eftersom det inte är ' skrev SirPython inte starkt. På så sätt kan jag testa det med enhetstester utan att göra ett enhetstest för varje ' hårdkodad sträng '. Så måste testbarhet och den hastighet jag kan skapa arbetskod.

Svar

Letade efter en liknande lösningen själv och kom på det här. Fungerar för att avgöra om nyckeln alls är inställd – och kommer att returnera SANT även om värdet på ”action” -tangenten är NULL.

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

Om $array["message"] har inga tangenter, isset returnerar FALSE och stoppar IF-satsen. Om $array["message"] har några tangenter – även sådana med NULL-värden – isset returnerar SANT, så att du säkert kan kontrollera om "action" arraynyckel finns i $array["message"].

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *