web-dev-qa-db-ja.com

異なる結果を与える多次元配列のJSON_ENCODE

PHPで多次元配列のjson_encodeを実行するとき、配列に名前を付けないのではなく、配列の1つに名前を付けるだけで異なる出力に気付きます。例えば:

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

複数のjsonオブジェクトの単一の配列を提供します

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

一方、中央の配列に名前を割り当てるだけです

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

内部に複数のjsonオブジェクトを持つ単一のjsonオブジェクトを作成します

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

「secondarray」の代わりに「1」を使用して、1番目のオプションが2番目のexecptと同じ結果を返さない理由

21
dangel

JSONでは、配列[]にはすべて数値キーがありますが、オブジェクト{}には文字列プロパティがあります。 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}}
31

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

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

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

1
Felix Kling

json形式でのこの出力は、year1 {a、b}、year2 {c}、year3 {d}です年2のcと年3のd

$array1 = array('a'=>1, 'b'=>2);
    $array2 = array('c'=>3);
    $array3 = array('d'=>4)
    $form = array("year1" =>$array1,
                  "year2" =>$array2,
                  "year3" =>$array3,
            );

    $data = json_encode($form);
0
Nabeel Ali

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

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

最初の配列をjsonエンコードする場合、生成されたjson文字列に整数を表示する必要はありません。これは、デコーダーが0、1、および2であることを「推測」できる必要があるためです。

しかし、2番目の配列では、デコーダーが配列のキー値を認識している必要があるため、これが必要です。

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

0
Fernando