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 显示“姓名”和“dob”,深度 2 也显示父母。我不明白为什么 1 或 2 的深度根本不显示任何内容。

谁能向我解释我不明白的地方?

4

3 回答 3

9

文档说明了原因。

如果无法解码 json 或编码的数据比递归限制深,则返回 NULL 。

于 2013-10-15T19:04:00.820 回答
4

这里的问题是你没有depth正确理解参数

数组的深度test为 3,因此在前两次迭代中不会打印它并null返回一个值

但在第 3 次迭代中,它被打印出来,因为它的深度等于$depth[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 版添加的(json_decode从 5.3.0 开始就有)。在此处查看更改日志。

于 2014-07-02T23:47:36.920 回答