我正在使用PHP创建一个非常大的多维数组。每个对象都包含Name,ID,ParentID和Children。子元素是一组具有相同格式的更多对象。
关键是我命名每个对象的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 :(得分:5)
JSON数组没有显式索引,它只是一个有序列表。唯一具有命名键的JSON数据结构是一个对象。字面意思应该很明显:
["foo", "bar", "baz"]
此数组没有命名索引,也没有任何要添加的规定。
PHP将列表和键值存储混合为一个array
数据类型。 JSON没有。
答案 1 :(得分:2)
这是你的对象:
$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。无论如何,有一天,有人可能会发现它很有用。
答案 2 :(得分:1)
我现在有了一个快速且运行良好的工作解决方案。
首先,如问题中的SO链接所写;
在JSON中,数组只有数字键,而对象有字符串 属性。包含数组键会强制整个外部 结构是必要的对象。
在JSON中;大括号保持对象({}
),方括号保持数组([]
)。
因此,使用字符串作为键将导致json_encode
函数返回对象,而重置键将确保它创建数组。
因此,在我返回JSON编码字符串之前,我运行一个函数来重置所有数组键。我在这个SO线程(Reset array keys in multidimensional array)上找到的代码特别有用!
答案 3 :(得分:0)
http://php.net/manual/en/function.json-decode.php
将json_decode的第二个参数设置为true,至少为get assoc数组。
除此之外:javascript无法处理非顺序/非连续的数组索引,因此只要id不是顺序的,json就没有其他选项可以将其转换为“字符串”索引。