ホームページ  >  記事  >  バックエンド開発  >  「json_encode」がスパース PHP 配列を JSON オブジェクトに変換するのはなぜですか?

「json_encode」がスパース PHP 配列を JSON オブジェクトに変換するのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-21 07:53:08691ブラウズ

Why Does `json_encode` Convert Sparse PHP Arrays to JSON Objects?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。