次のようなデータ構造があるとします:
array(3) { ["id"]=> int(1) ["name"]=> string(3) "foo" ["message"]=> array(1) { ["action"]=> string(3) "PUT" } }
「メッセージ」と「アクション」はどちらもオプションです。それらが存在するかどうかを確認するための最初の試みは、次のようなものを書くことです。
if (array_key_exists("message", $array) && array_key_exists("action", $array["message"])){ }
よりクリーンな実装はありますか?
コメント
- 関連項目: stackoverflow.com/questions/2948948/ … 再帰的に機能するarray_key_existsユーティリティ関数を記述できます。
回答
いいえ、これ
特定のスクリプト言語に限定されていなくても、よりクリーンなソリューションを考えることはできませんか?
回答
これを行うだけです!
if (isset($array["message"]["action"])) { /*...*/ }
証明:
<?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
ログエントリなし。
次の場合は注意してください。値がnull
の場合、issetもfalseを返します。おそらくnull
で値を作成するべきではありません。
コメント
- この回答にも
)
がありません。また、isset($array['message'])
逆参照する前に。 - @Brythanいいえ、ログエントリは発生しません。しかし、はい、
)
がありません。 - 申し訳ありませんが、'が必要であることを指摘しておきます。エラー報告をクランクします。エラー報告が設定されている場合は、絶対にログエントリが発生します。 '以前にログにスパムを送信したことがあります。これは、ある時点でのデフォルトのロギングでした。現在はデフォルトではない可能性があります(またはホストがエラーレポートをダイヤルダウンしている可能性があります)が、その状況では特定の構成でログエントリが生成される可能性があると確信しています。
- いいえ実際には' tすべてのエラーレポートをオンにしてテストしました!
回答
明確ではありませんが、おそらく最速の解決策:
if ((isset($array["message"]["action"]) || (array_key_exists("message", $array) && array_key_exists("action", $array["message"]))) { /* ... */ }
一部の値はisset()
で評価されるため、2番目のチェックが必要です。インデックスが存在していてもfalseになります。
回答
私はこれを私のプロジェクトで使用していますが、私は ” m null
をミュート状態として使用します。 (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; }
ツリー内のpath
を検索する関数です。
echo option_select([A=>[B=>[C=>"hello world"]]], "NO?", "A", "B", "C");
ご覧のとおり、配列の値をループしています:path
。最初は、検索する必要のある配列への参照としてカーソルを設定しています。new
キーを見つけるたびに、カーソルの参照を私が検索している現在のキー。xdebug
と優れたGUIがあれば、必要なアルゴリズムに書き換えることができます。これがisset($cursor[$key])
変更する必要があります。または、関数として挿入します:f($cursor, $key, $default) => (bool)
コメント
- 別のソリューションを提供しましたが、コードを確認していません。すでに持っているものではなく、これがOPにとってより良い解決策になる理由についての説明を追加してください。
- 強い型のSirPythonではないため'。このようにして、' hardcoded-string 'ごとに単体テストを行うことなく、単体テストでテストできます。したがって、テスト容易性と、動作するコードを作成できる速度に関係しています。
回答
同様のものを探していました自分で解決し、これを思いついた。キーが設定されているかどうかを判断するために機能し、「アクション」キーの値がNULLの場合でもTRUEを返します。
if (isset($array["message"]) && array_key_exists("action",$array["message"])) { /* ... */ }
If $array["message"]
にはキーがないため、isset
はFALSEを返し、IFステートメントを停止します。 $array["message"]
にキーがある場合(NULL値のキーでも)、isset
はTRUEを返し、"action"
配列キーは$array["message"]
に存在します。