json_encode で JSON オブジェクトとしてエンコードされた疎配列
配列にインデックスが欠落している場合、その配列は疎配列と呼ばれます。 json_encode は、デフォルトで、スパース配列を配列ではなく JSON オブジェクトとして処理します。これにより、さまざまなシナリオで予期しない動作が発生する可能性があります。
配列からオブジェクトへの変換の原因
JSON 構文は、インデックスが欠落している配列をサポートしていません。 json_encode はスパース配列を検出すると、それがオブジェクトであると想定し、それに応じて変換します。
例
次のことを考えてください。 code:
$a = array( new stdClass, new stdClass, new stdClass ); $a[0]->abc = '123'; $a[1]->jkl = '234'; $a[2]->nmo = '567'; // First JSON encoding echo json_encode($a) . "\n"; // Unset an element unset($a[1]); // Second JSON encoding echo json_encode($a) . "\n";
Output
[{"abc":"123"},{"jkl":"234"},{"nmo":"567"}] {"0":{"abc":"123"},"2":{"nmo":"567"}}
最初のエンコードでは、配列は期待どおり JSON 配列に変換されます。ただし、インデックス 1 の設定を解除した後、スパース配列の問題により、2 番目のエンコードでは JSON オブジェクトが生成されます。
防止
この動作を防止し、一貫した配列エンコードを保証するには、json_encode に渡す前に、array_values() を使用して配列のインデックスを再設定できます。これにより、配列内の穴がすべて削除され、json_encode によって配列として扱われるようになります。
修正コード
echo json_encode(array_values($a)) . "\n";
この修正コードは、常に $a を次のようにエンコードします。インデックスが欠落しているかどうかに関係なく、JSON 配列。
以上が「json_encode」がスパース PHP 配列を JSON オブジェクトに変換するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。