9

我正在使用 PHP 创建一个非常大的多维数组。每个对象都包含名称、ID、ParentID 和 Children。子项是具有相同格式的多个对象的数组。

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

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

正如我在这里的另一个 SO 线程上所读到的,它们“由于包含字符串键而被制成对象” - 尽管它们是数字,但它们仍然是字符串。

{
"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": [
4

4 回答 4

6

JSON 数组没有明确的索引,它只是一个有序列表。唯一具有命名键的 JSON 数据结构是对象。字面意思应该很明显:

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

这个数组没有命名索引,也没有任何规定可以添加任何索引。

PHP 将列表和键值存储合并为一种array数据类型。JSON没有。

于 2013-05-07T13:23:40.557 回答
3

这是你的对象:

$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。无论如何,总有一天,有人可能会发现它很有用。

于 2014-12-20T16:58:00.943 回答
2

我现在有了一个快速且运行良好的工作解决方案。

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

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

    在 JSON 中;花括号包含对象 ( {}),方括号包含数组 ( [])。

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

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

于 2013-05-07T14:28:04.447 回答
-2

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

将 json_decode 的第二个参数设置为 true 以至少获取 assoc 数组。

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

于 2013-05-07T13:01:10.470 回答