Angenommen, ich habe eine Datenstruktur wie diese:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
Wobei „Nachricht“ und „Aktion“ beide optional sind. Um zu überprüfen, ob sie „meinen ersten Versuch darstellen, würde ich so etwas schreiben:
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
Gibt es eine sauberere Implementierung?
Kommentare
- Siehe auch: stackoverflow.com/questions/2948948/… Sie können eine Dienstprogrammfunktion array_key_exists schreiben, die rekursiv funktioniert.
Antwort
Nein, dies ist nur die Art und Weise, dies zu tun.
Selbst wenn ich nicht auf eine bestimmte Skriptsprache beschränkt bin, kann ich mir keine sauberere Lösung vorstellen?
Antwort
Sie können dies einfach tun!
if (isset($array["message"]["action"])) { /*...*/ }
Beweis:
<?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
Keine Protokolleinträge.
Beachten Sie, dass if Ihr Wert ist null
, dann gibt isset auch false zurück. Sie sollten wahrscheinlich keine Werte mit null
erstellen.
Kommentare
- In dieser Antwort fehlt auch eine
)
und möglicherweise wird ein Protokolleintrag generiert, daisset($array['message'])
vor dem Dereferenzieren. - @Brythan nein, es verursacht keinen Protokolleintrag. Aber ja, es fehlt ein
)
. - Entschuldigung, ich wollte darauf hinweisen, dass Sie ' müssen Kurbeln Sie Ihre Fehlerberichterstattung an. Es verursacht absolut einen Protokolleintrag, wenn Sie Ihre Fehlerberichterstattung dafür eingestellt haben. Ich habe ' meine Protokolle zuvor mit Spam versehen. Dies war die Standardprotokollierung an einem Punkt. Dies ist derzeit möglicherweise nicht die Standardeinstellung (oder Ihr Host hat möglicherweise die Fehlerberichterstattung heruntergewählt), aber ich bin absolut sicher, dass diese Situation unter bestimmten Konfigurationen einen Protokolleintrag generieren kann.
- Nein, dies ist nicht wirklich der Fall = „aa107bbcf8″>
t Ich habe es bei eingeschalteter Fehlerberichterstattung getestet!
Antwort
Nicht klarer, aber wahrscheinlich die schnellste Lösung:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
Die zweite Überprüfung ist erforderlich, da einige Werte mit isset()
ausgewertet werden wird falsch sein, obwohl der Index existiert.
Antwort
Ich verwende dies in einem meiner Projekte, aber ich “ m Verwenden von null
als stummgeschalteten Zustand. (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; }
Es ist eine Funktion, die eine path
in einem Baum sucht.
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
Wie Sie sehen können. Ich durchlaufe die Werte über ein Array: path
. Am Anfang setze ich einen Cursor als Referenz auf ein Array, in dem ich suchen muss. Jedes Mal, wenn ich eine new
-Taste finde, setze ich die Referenz des Cursors auf das aktueller Schlüssel, nach dem ich suche. Wenn Sie xdebug
und eine gute GUI haben, können Sie ihn in den gewünschten Algorithmus umschreiben. Es ist die isset($cursor[$key])
müssen Sie ändern. Oder injizieren Sie es als Funktion: f($cursor, $key, $default) => (bool)
Kommentare
- Sie haben eine alternative Lösung bereitgestellt, aber Code nicht überprüft. Bitte fügen Sie eine Erklärung hinzu, warum dies eine bessere Lösung für das OP wäre, als das, was sie bereits haben.
- Da es nicht ' ist, ist SirPython nicht stark typisiert. Auf diese Weise kann ich es mit Unit-Tests testen, ohne einen Unit-Test für jeden ' fest codierten String ' durchzuführen. Das muss mit Testbarkeit und der Geschwindigkeit geschehen, mit der ich Arbeitscode erstellen kann.
Antwort
Ich habe nach einem ähnlichen gesucht Lösung selbst und kam mit diesem. Funktioniert, um festzustellen, ob der Schlüssel überhaupt gesetzt ist – und gibt TRUE zurück, selbst wenn der Wert des Schlüssels „action“ NULL ist.
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
If $array["message"]
hat keine Schlüssel, die isset
gibt FALSE zurück und stoppt die IF-Anweisung. Wenn $array["message"]
Schlüssel hat – auch solche mit NULL-Werten – gibt isset
TRUE zurück, sodass Sie sicher prüfen können, ob "action"
Array-Schlüssel ist in $array["message"]
vorhanden.