25

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}};

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

4

4 に答える 4

37

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}}
于 2012-05-28T02:29:52.360 に答える
2

連続した数値キーを持つ配列は、JSON配列としてエンコードされます。それがまさにその通りです。なんで?それは理にかなっているからです。

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

json_encodeドキュメントのすべての例を参照してください。

于 2012-05-28T02:30:46.107 に答える
1

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

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

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

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

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

于 2012-05-28T02:36:18.177 に答える
0

json形式の場合のこの出力は、year1 {a、b}、year2 {c}、year3 {d} ** aの値は1、b = 2、c = 3、d = 4で、year1のa、bの配列に格納されます。 years2のcとyears3の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);
于 2019-04-11T06:29:12.137 に答える