この問題は、有効な整数である文字列キーを持つオブジェクトにキャストするときに発生します。array
このオブジェクトがある場合:
object(stdClass)#1 (2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
そして、あなたはそれをキャストします
$array = (array)$object
この配列を取得します
array(2) {
["207"]=>
string(3) "sdf"
["210"]=>
string(3) "sdf"
}
$array["207"]
直接アクセス likeは常に存在しないに変換されるため、それらをループすることによってのみアクセスできるキーがあります。$array[207]
上記のようなオブジェクトを次のようなjson_decode()
文字列に適用しているので
$json = '{"207":"sdf", "210":"sdf"}'
最善の解決策は、最初から数字キーを避けることです。これらはおそらく、オブジェクトの配列の数値プロパティとしてモデル化する方が適切です。
$json = '[{"numAttr":207, "strAttr":"sdf"}, {"numAttr":210, "strAttr":"sdf"}]'
このデータ構造には、現在のものよりもいくつかの利点があります。
- 数値プロパティを持つオブジェクトのコレクションとして、元のデータをよりよく反映します
- 他のプロパティで容易に拡張可能
- さまざまなシステム間での移植性が向上します (ご覧のとおり、現在のデータ構造は PHP で問題を引き起こしていますが、別の言語を使用すると、同様の問題に簡単に遭遇する可能性があります)。
プロパティ → オブジェクト マップが必要な場合は、次のようにすばやく取得できます。
function getNumAttr($obj) { return $obj->numAttr; } // for backward compatibility
$arr = json_decode($json); // where $json = '[{"numAttr":...
$map = array_combine(array_map('getNumAttr', $arr), $arr);
他の解決策は、 ascii-lime が提案したようにすることですjson_decode()
。2番目のパラメーターをに設定することにより、オブジェクトの代わりに連想配列を強制的に出力しますtrue
。
$map = json_decode($json, true);
入力データの場合、これは直接生成します
array(2) {
[207]=>
string(3) "sdf"
[210]=>
string(3) "sdf"
}
配列のキーが文字列ではなく整数になっていることに注意してください。
ただし、JSON データ構造を変更することは、よりクリーンなソリューションであると考えていますが、そうできない可能性があることは理解しています。