PHP 関数 json_decode (デフォルト) はオブジェクトを返します。2 番目の引数を切り替えると、配列が返されます。
オブジェクトを理解していないだけかもしれませんが、オブジェクトにはプロパティとメソッド (おそらくイベントも) があると思いました。配列にはプロパティしかありません。
json_decode がプロパティのみを返し、メソッドを返さないことを考えると、常に配列を返すべきではありませんか?
JSON はオブジェクト構造を定義するため、オブジェクトを返します。これは、「JS O N」の「O」の略です。
ここから、言語間の違いがより明確になり始めます。
Javascript は、PHP が名前付きキーを持つ配列を使用するオブジェクトを使用します。JS は配列内に名前付きキーを持つことはできず、オブジェクト内にのみ持つことができます。他の言語では、変数の構造に別の制限があります。
オブジェクトを使用するということは、PHP が JSON の他の言語実装と可能な限り一貫していることを意味します。JSON は言語間の通信用に設計されているため、一貫性が重要です。
しかし、あなたが言うように、PHP では配列を操作する方が簡単な場合があるため、PHP は直接配列に変換するオプションを提供しています。
ただし、PHP 配列はJSON 配列およびオブジェクトと同じではないことに注意してください。PHP では、名前付き配列キーと番号付き配列キーを混在させることができます。これは JSON にうまくマッピングされないため、JSON を扱うために PHP 配列を使用している場合は注意が必要です。JSON の作業に PHP オブジェクトを使用している場合、この機能の不一致はありません。
さて、あなたはすでにこれを知っていたようです:
デフォルトでjson_decode
は、StdClass オブジェクトを返します。配列が必要な場合は、次を使用します。
json_decode($jsondata, true);
参照: http://php.net/manual/en/function.json-decode.php
したがって、「なぜ」に答えるには:
JSON は階層的なデータセットを格納するために使用される形式であり、過去に XML が使用されていた方法とよく似ています。ただし、Javascript はオブジェクト プロパティにアクセスするために最適化されているため、JSON 構造を操作するために追加のライブラリを用意する必要はありません。JSON 構造は Javascript の実際のオブジェクトです。
JSON は XML よりも解析しやすく、バックエンド言語でオブジェクトや配列に変換するのは比較的簡単です。PHP 以外の多くの言語では、Dictionary または Hashtable と呼ばれるものがあり、通常はキーと値のペアを持つオブジェクトです。
PHP は配列と「連想配列」をコンテキスト以外で区別しません。そのため、PHP 開発者にとって、結果が連想配列であると期待するのは自然なことであり、そのオプションは存在しますが、おそらく柔軟性のためです (おそらく、より自然にデコードしてオブジェクト) オブジェクト形式が存在します。
それが説明できることを願っています。また、JSON とは何か (およびそうでないもの) について詳しく読むことを強くお勧めします: http://json.org
json_decode
stdClass
デフォルトでは、クラスからオブジェクトを返します。これは、オブジェクトの基本 (トップレベル) ジェネリック クラスです。このクラスには、まずメソッドも属性もありません。
ただし、「オンザフライ」と呼ばれるものを追加できますDynamic Properties
。詳細はこちら:
キーと値のペアを入れるプロパティ バッグだけが必要な場合もあります。1 つの方法は array を使用することですが、これにはすべてのキーを引用符で囲む必要があります。もう 1 つの方法は、 StdClassのインスタンスで動的プロパティを使用することです。
それが役に立てば幸い。
stdClass のオブジェクトを返します。オブジェクトがオブジェクトに変換された場合、そのオブジェクトは変更されません。他の型の値がオブジェクトに変換される場合、stdClass 組み込みクラスの新しいインスタンスが作成されます。値が NULL の場合、新しいインスタンスは空になります。配列は、キーによって名前が付けられたプロパティと対応する値を持つオブジェクトに変換されます。その他の値については、scalar という名前のメンバー変数に値が含まれます。