Meglévő kulcs ellenőrzése a többdimenziós tömbben

Tegyük fel, hogy ilyen adatstruktúrám van:

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

Ahol az “üzenet” és a “művelet” egyaránt választható. Az első kísérletem az lenne, ha ilyet írnék:

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

Van tisztább megvalósítás?

Megjegyzések

Válasz

Nem, ez csak ennek a módja.

Még akkor is, ha nem vagyok korlátozva egy bizonyos szkriptnyelvre, nem tudok tisztább megoldásra gondolni?

Válasz

Csak megteheti!

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

Bizonyítás:

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

Nincs naplóbejegyzés.

Ne feledje, hogy ha értéke null, akkor az isset is hamis értéket ad vissza. Valószínűleg nem “értékeket kell létrehoznia a null.

Megjegyzések

  • Ennek a válasznak hiányzik egy ) is, és naplóbejegyzés generálódását okozhatja a isset($array['message']) mielőtt levonnánk róla.
  • @Brythan no nem okoz naplóbejegyzést. De igen, hiányzik belőle egy ).
  • Sajnálom, arra akartam felhívni a figyelmet, hogy ' meg kell forgassa a hibajelentést. Abszolút naplóbejegyzést okoz, ha a hibabejelentés be van állítva. ' Korábban ezzel spameltem a naplóimat. Ez volt az alapértelmezett naplózás egy ponton. Lehet, hogy ez most nem az alapértelmezett (vagy a gazdagép tárcsázta a hibajelentést), de teljesen biztos vagyok abban, hogy ez a helyzet bizonyos konfigurációkban naplóbejegyzést generálhat.
  • Nem, valójában nem ' t az összes hibajelentés bekapcsolásával teszteltem!

Válasz

Nem egyértelműbb, de valószínűleg a leggyorsabb megoldás:

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

A második ellenőrzésre azért van szükség, mert néhány értéket a isset() hamis eredményt ad, annak ellenére, hogy az index létezik.

Válasz

Ezt egy projektemben használom, de én ” m a null némított állapotként. (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; } 

Ez egy olyan funkció, amely egy path elemet keres egy fában.

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

Amint láthatja. Egy tömbön átívelem az értékeket: path. Eleinte “kurzort állítok be egy tömbre hivatkozva, amiben keresnem kell. Minden alkalommal, amikor találok egy new billentyűt, beállítom a kurzor hivatkozását a az aktuális kulcs, amelyet keresek. Ha van xdebug és jó GUI-ja van, átírhatja azt a kívánt algoritmusba. Ez a isset($cursor[$key]) változtatnia kell. Vagy injektálja függvényként: f($cursor, $key, $default) => (bool)

Megjegyzések

  • Alternatív megoldást adott, de nem ellenőrizte a kódot. Kérjük, adjon magyarázatot arra, hogy ez miért lenne jobb megoldás az OP számára, nem pedig az, amivel már rendelkezik.
  • Mivel nem ' nem erősen beírta a SirPython-t. Így tesztelhetem egység tesztekkel, anélkül, hogy minden ' hardcoded-string ' egység tesztet végeznék. Így kell tennem a tesztelhetőséggel és a sebességgel, amellyel működőképes kódot hozhatok létre.

Válasz

Kerestem hasonlót megoldást magam, és ezt találtam ki. Úgy működik, hogy meghatározza, hogy a kulcs egyáltalán be van-e állítva, és akkor is IGAZ eredményt ad, ha a “művelet” kulcs értéke NULL.

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

Ha $array["message"] nem rendelkezik kulcsokkal, a isset a FALSE-t adja vissza, leállítva az IF utasítást. Ha a $array["message"] -nek vannak kulcsai – még NULL értékűek is -, akkor isset IGAZ értéket ad vissza, így biztonságosan ellenőrizheti, hogy a "action" tömbkulcs létezik a $array["message"] fájlban.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük