2012-05-28 7 views
17

PHPでjson_encodeを多次元配列にするとき、名前を付けないで配列の名前を付けるだけで、別の出力に気づくでしょう。例えば:多次元配列のJSON_ENCODEが異なる結果を返す

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

は、複数のJSONの単一のアレイは、単に中央アレイ

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4)); 
json_encode($arrytest) 

に名前を割り当てる一方

[{"a":1,"b":2},{"c":3},{"d":4}]; 

オブジェクト与えると単一のJSONオブジェクトを作成します複数のjsonオブジェクトが内部にある

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}}; 

なぜ第一選択肢はJSONで「secondarray」

+0

http://json.org/ –

+3

Felix Kling、なぜjson-encodeタグを削除したのですか?私はあなたが持ってはならないと言っているのではなく、むしろ正しいタグ付けのためにjson-encodeが自分のコードにあることを確かめています。 – dangel

答えて

25

の代わりに「1」と第二execpt同じreasultsを返さないと、配列は[]のみ、すべての文字列プロパティを持つ{}オブジェクトに対し、数字キーを持っています。 2番目の例に配列キーを含めると、必要に応じて外部構造全体がオブジェクトになります。両方の例の内部オブジェクトは、文字列キーa,b,c,dを含むため、オブジェクトとして作成されます。

最初の例でJSON_FORCE_OBJECTオプションを使用する場合は、外部構造体を配列ではなくオブジェクトで、同様の構造体を2番目の構造体に戻す必要があります。オブジェクトとして指定することなく、外部配列に文字列キーがないと、PHPはJSONの同等の配列構造としてエンコードされると想定します。

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4)); 

// Force the outer structure into an object rather than array 
echo json_encode($arrytest , JSON_FORCE_OBJECT); 

// {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}} 
+4

Javascriptと何も関係がない場合は、なぜそれをJAVASCRIPT OBVECT NOTATIONと呼んでください。 – Brendan

+0

今、私は正しい方向に向かうだろうと思うその説明に感謝する。 – dangel

+1

@BrendanなぜJavascriptとは関係がありませんか? – deceze

0

数値キーが連続する配列は、JSON配列としてエンコードされます。それがまさにそれです。どうして?それは理にかなっているからです。

キーは配列エンコーディングで暗黙的に表現できるため、オブジェクトキーとして明示的にエンコードする必要はありません。

json_encode documentationのすべての例を参照してください。

+0

私は彼らがそうであってはならないと言っているわけではないので、私はその質問をしていたのです。 – dangel

0

最初のオプションには、数値インデックス(0,1,2)しかありません。それらは明示的に宣言されていませんが、自動的に作成されます。

2番目のオプションでは、インデックスの1つを文字列として宣言し、これによりPHPは内部的にすべてのインデックスを文字列に変換します。

あなたはJSONエンコード、それは最初の配列の任意のデコーダは、彼らが0であることを「推測」することができるはずですので、生成されたJSON文字列の整数を表示する必要はありません1及び2

しかし中これはデコーダが配列のキー値を知っていなければならないためです。

かなり簡単です。配列で宣言されたインデックスはありませんか?彼らは0,1,2,3などです。