【问题标题】:JSON_ENCODE of multidimensional array giving different results多维数组的 JSON_ENCODE 给出不同的结果
【发布时间】:2012-06-02 11:19:47
【问题描述】:

在 PHP 中对多维数组进行 json_encode 时,我注意到一个不同的输出,只需命名其中一个数组,而不是不命名它们。例如:

$arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
json_encode($arrytest)

给出一个包含多个 json 对象的数组

[{"a":1,"b":2},{"c":3},{"d":4}];

而只是为中间数组分配一个名称

$arrytest = array(array('a'=>1, 'b'=>2),"secondarray"=>array('c'=>3),array('d'=>4));
json_encode($arrytest)

创建一个包含多个 json 对象的单个 json 对象

{"0":{"a":1,"b":2},"secondarray":{"c":3},"1":{"d":4}};

为什么第一个选项不会返回与第二个执行相同的结果,用“1”代替“secondarray”

【问题讨论】:

  • Felix Kling,你为什么要删除我的 json-encode 标签?我并不是说你不应该这样做,而是我想确保我遵循正确的标记程序,因为 json-encode 在我的代码中,我虽然它会作为适当的标记应用。跨度>

标签: php arrays json


【解决方案1】:

json 形式的输出是 year1{a,b},year2{c}, year3{d} **a 的值 1 ,b=2,c=3,d=4 分别存储在 year1 的 a,b years2 的 c 和 years3 的 d 数组中

$array1 = array('a'=>1, 'b'=>2);
    $array2 = array('c'=>3);
    $array3 = array('d'=>4)
    $form = array("year1" =>$array1,
                  "year2" =>$array2,
                  "year3" =>$array3,
            );

    $data = json_encode($form);

【讨论】:

  • 请在您的代码中添加一些解释,以便其他人可以从中学习 - 您的代码如何解释两个输入数组导致不同的输出?
【解决方案2】:

具有连续数字键的数组被编码为 JSON 数组。就是这样。为什么?因为它有意义。

由于可以通过数组编码隐式表达键,因此没有理由将它们显式编码为对象键。

查看json_encode documentation中的所有示例。

【讨论】:

  • 我并不是说他们不应该,这就是我问这个问题的原因。
【解决方案3】:

在第一个选项中,您只有数字索引(0、1 和 2)。虽然它们没有显式声明,但 php 会自动创建它们。

在第二个选项中,您将其中一个索引声明为字符串,这使得 PHP 在内部将所有索引转换为字符串。

当您对第一个数组进行 json 编码时,不必在生成的 json 字符串中显示整数,因为任何解码器都应该能够“猜测”它们是 0、1 和 2。

但在第二个数组中,这是必要的,因为解码器必须知道数组中的键值。

这很简单。数组中没有声明索引?它们是 0、1、2、3 等等。

【讨论】:

    【解决方案4】:

    在 JSON 中,数组 [] 只有每个都有数字键,而对象 {} 有字符串属性。在第二个示例中包含数组键会强制整个外部结构成为对象。由于包含字符串键 a,b,c,d,因此两个示例的内部对象都被制成对象。

    如果您在第一个示例中使用JSON_FORCE_OBJECT 选项,您应该返回与第二个示例类似的结构,外部结构是对象而不是数组。如果不指定您希望它作为对象,外部数组中缺少字符串键会导致 PHP 假定它被编码为 JSON 中的等效数组结构。

    $arrytest = array(array('a'=>1, 'b'=>2),array('c'=>3),array('d'=>4));
    
    // Force the outer structure into an object rather than array
    echo json_encode($arrytest , JSON_FORCE_OBJECT);
    
    // {"0":{"a":1,"b":2},"1":{"c":3},"2":{"d":4}}
    

    【讨论】:

    • 那为什么叫它JAVASCRIPT OBJECT NOTATION,如果它与Javascript无关。
    • 现在说得通了,感谢您的解释,我认为这将使我朝着正确的方向前进。
    • @Brendan 为什么和 Javascript 无关?
    • @deceze 早前为此提供上下文的评论已被删除。
    • 是的,现在看起来很愚蠢,我在那里有那个。作为参考,有人说 JSON 与 Javascript 无关。
    猜你喜欢
    • 1970-01-01
    • 2015-04-26
    • 2012-09-15
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多