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
- Lásd még: stackoverflow.com/questions/2948948/… Írhat egy array_key_exists segédfunkciót, amely rekurzívan működik.
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 aisset($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.