8

PHP の json_decode 関数には「深さ」パラメーターがあり、再帰の深さを指定できます。しかし、次のコード:

test = array(
    'name' => 'sean',
    'dob' => '12-20',
    'parents' => array(
        'father' => 'tommy',
        'mother' => 'darcy'
    )
);

foreach(range(1, 3) as $depth) {
    echo "-----------------\n depth: $depth\n";
    print_r(json_decode(json_encode($test), true, $depth));
}

次の出力が生成されます。

-----------------
 depth: 1
-----------------
 depth: 2
-----------------
 depth: 3
Array
(
    [name] => sean
    [dob] => 12-20
    [parents] => Array
        (
            [father] => tommy
            [mother] => darcy
        )

)

私が期待するのは、深さ 1 で「名前」と「生年月日」を表示し、深さ 2 で親も表示することです。深さ 1 または 2 で何も表示されない理由がわかりません。

私が理解していないことを誰かに説明してもらえますか?

4

3 に答える 3

9

ドキュメントには理由が書かれています。

json をデコードできない場合、またはエンコードされたデータが再帰制限より深い場合は、NULL が返されます。

于 2013-10-15T19:04:00.820 に答える
4

depthここでの問題は、パラメータを正しく理解していないことです

配列の深さtestは 3 であるため、最初の 2 回の反復では出力されず、null値が返されます

$depthしかし、3 回目の反復では、深さが[ie 3]に等しいため、印刷されます。

于 2013-10-15T20:01:31.253 に答える
3

@Explosion Pills の回答に加えて、正常json_decodeに動作することを期待していますjson_encode

ドキュメントによると、配列/オブジェクトをエンコードするために、独自の制限を指定できるようになりました。これは単に、指定されたレベルよりも深くスキップすることを意味します。

それjson_decodeは異なります-JSON文字列全体を常に解析しようとします。これは、文字列全体を解析せずに停止し、より深い部分をスキップすることができないためです。これが、深さの制限により、この場合に関数が NULL を返す理由です。

json_encodeデータ構造はすでにメモリ内で定義されているため、より深い部分を停止してスキップできます。

$depthforjson_encodeが PHP バージョン 5.5.0 に追加されたことに注意してください ( 5.3.0json_decode以降あります)。ここで変更ログを確認してください。

于 2014-07-02T23:47:36.920 に答える