2013-05-07 76 views
4

我正在使用PHP创建一个非常大的多维数组。每个对象都包含名称,ID,ParentID和Children。儿童是以相同格式的更多对象的数组。多维数组上的json_encode() - 使用字符串键

这很重要我将每个对象的ID都命名 - 这有助于我将每个对象放在正确的父对象下。 (在下面的代码中,我使用101,102等)

但是,我遇到的问题是当我使用json_encode在JSON中返回数组。每个'Children'数组都被打印为对象,而不是数组 - 如下面的JSON代码所示。

当我在另一个SO线程here上阅读时,它们“由于包含字符串键而被制成对象” - 虽然它们是数字,但它们仍然是字符串。

{ 
"101": { 
    "ID": "101", 
    "ParentID": "0", 
    "Name": "Root One" 
    "Children": { 
     "102": { 
      "ID": "102", 
      "ParentID": "101", 
      "Name": "Child One" 
     }, 
     "103": { 
      "ID": "103", 
      "ParentID": "101", 
      "Name": "Child Two", 
      "Children": { 
       "104": { 
        "ID": "104", 
        "ParentID": "103", 
        "Name": "Child Child One" 
       } 
      } 
     }, 

有谁知道如何解决这个问题?

编辑:的JSON应该是这样的(方括号中是很重要的!):

[ 
{ 
    "ID": "101", 
    "ParentID": "0", 
    "Name": "Root One", 
    "Children": [ 
     { 
      "ID": "102", 
      "ParentID": "101", 
      "Name": "Child One", 
      "Children": [ 
+0

这实际上是因为指数不是连续的,即存在差距。 – 2013-05-07 13:04:34

+0

此外,你的“孩子”ARE对象(从我的角度来看)而不是数组。很高兴,让OOP在你内部流动。 – 2013-05-07 13:20:56

回答

1

我现在有一个工作的解决方案,速度快,效果很好。

  1. 首先,如问题所写的SO链接;

    在JSON中,数组只有数字键,而对象具有字符串 属性。包含一个数组键会迫使整个外部结构成为必需的对象。

    在JSON中;大括号可容纳物体({}),方括号可容纳数组([])。

  2. 因此,使用字符串作为键将导致json_encode函数返回对象,而重新设置键将确保它创建数组。

  3. 因此,就在我返回我的JSON编码字符串之前,我运行一个函数来重置所有数组键。我在这个SO线程(Reset array keys in multidimensional array)上找到的代码特别有用!

0

http://php.net/manual/en/function.json-decode.php

设置json_decode的第二个参数为true,ATLEAST得到ASSOC阵列。

除此之外:javascript无法处理非顺序/非连续的数组索引,因此只要id不是顺序的,json就没有其他选择,然后将其转换为“字符串”索引。

+0

感谢您的回答,它将来无疑是有用的,但我在jQuery中使用了返回的JSON! – Patrick 2013-05-07 14:24:36

+0

这几乎不会改变JavaScript无法处理非顺序数组键的事实。因此JSON也是如此。因此既不能jQuery。 – 2013-05-07 14:51:09

+1

一个downvote没有评论1年后,这篇文章..人们想知道为什么o.O – 2014-05-20 08:25:23

4

JSON数组没有明确的索引,它只是一个有序列表。唯一具有命名密钥的JSON数据结构是一个对象。字面应该使这种相当明显的:

["foo", "bar", "baz"] 

阵列没有命名的指数并没有任何条款添加任何。

PHP将列表和键值存储区域合并为一个array数据类型。 JSON不会。

+0

关联数组已命名键 – 2013-05-07 13:25:42

+2

@mohammad *** PHP ***有“关联数组”,*** JSON ***不! JSON的“关联数组”被称为* objects *。 – deceze 2013-05-07 13:26:18

+0

谢谢,我遇到的问题是JSON的结构(请参阅我的上次编辑)。这个问题是由于我的PHP关联数组中的命名键造成的。 – Patrick 2013-05-07 14:23:34

0

这是你的对象:

$parent=new StdClass(); 
$parent->ID=101; 
$parent->ParentID=0; 
$parent->Name='Root One'; 

$child1=new StdClass(); 
$child1->ID=1011; 
$child1->ParentID=$parent->ID; 
$child1->Name='Child One'; 
$parent->Children[]=$child1; 


$child1_1=new StdClass(); 
$child1_1->ID=10111; 
$child1_1->ParentID=$child1->ID; 
$child1_1->Name='Child One One'; 
$child1->Children[]=$child1_1;  

这是你的JSON转换功能:

echo json_encode($parent,JSON_PRETTY_PRINT); 

,这是你的对象编码成JSON格式:

{ 
    "ID": 101, 
    "ParentID": 0, 
    "Name": "Root One", 
    "Children": [ 
     { 
      "ID": 1011, 
      "ParentID": 101, 
      "Name": "Child One", 
      "Children": [ 
       { 
        "ID": 10111, 
        "ParentID": 1011, 
        "Name": "Child One One" 
       } 
      ] 
     } 
    ] 
} 

答案迟了,因为我开始学习之后的PHP。无论如何,有一天,有人可能会觉得它有用。