【问题标题】:json_encode() on a multidimensional array - with string keys多维数组上的 json_encode() - 带有字符串键
【发布时间】:2013-05-01 10:40:22
【问题描述】:

我正在使用 PHP 创建一个非常大的多维数组。每个对象都包含名称、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": [

【问题讨论】:

  • 实际上是因为索引不连续,即有间隙。
  • 另外,你的“孩子”是对象(从我的角度来看)而不是数组。高兴,让 OOP 在你的内心流动。

标签: php multidimensional-array json


【解决方案1】:

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

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

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

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

【讨论】:

  • 关联数组有命名键
  • @mohammad PHP 有“关联数组”,JSON 没有! JSON 的“关联数组”称为 objects
  • 谢谢,我遇到的问题是 JSON 的结构(请参阅我上次的编辑)。问题是由于我的 PHP 关联数组中的命名键引起的。
【解决方案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。不管怎样,总有一天,有人会发现它很有用。

【讨论】:

    【解决方案3】:

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

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

      在 JSON 中,数组只有数字键,而对象有字符串 特性。包含数组键会强制整个外部 结构必须是一个对象。

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 感谢您的回答,以后肯定会有用,但是我在jQuery中使用的是返回的JSON!
      • 这几乎不会改变 javascript 无法处理非顺序数组键的事实。因此 JSON 也不能。因此 jquery 也不能。
      • 在这篇文章发布 1 年后没有评论的反对票......有人想知道为什么 o.O
      猜你喜欢
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 2015-04-26
      • 2015-07-08
      • 2013-04-22
      • 2018-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多