在用PHP构建嵌套JSON时遇到麻烦


Having trouble building nested JSON with PHP

我有麻烦让这些数组正确嵌套。我正在从SQL数据库中抓取所有行,并为我的crud应用程序构建一个数组以JSON输出。一个类别很容易,但客户端现在想要子类别,这就是我遇到的主要问题。我试图将这些子类别嵌套到类别中。两者我都能做到,但我没能让它们一起工作。以下是我的PHP代码:

while ($row = $query->fetch_assoc()) {
    $categories[$row['category']][] = array(
        $row['subcategory'] => $subcategories[$row['subcategory']][] = array(
            'id'                 => $row['id'],
            'item_name'          => $row['item_name'],
            'description'        => $row['description'],
            'price'              => $row['price'],
        ),
    );
}
foreach ($categories as $key => $value) {
    $category_data[] = array(
        'category'   => $key,
        'category_list' => $value,
    );
}
foreach ($subcategories as $key => $value) {
    $subcategory_data[] = array(
        'subcategory'   => $key,
        'subcategory_list' => $value,
    );
}

当我json_encode($category_data)我得到以下JSON:

[
{
    "category": "Beer",
    "category_list": [
        {
            "Draft Beer": {
                "id": "1",
                "item_name": "Yuengling",
                "description": "Lager. Pottstown, Pa. An American classic."
            }
        },
        {
            "Draft Beer": {
                "id": "6",
                "item_name": "Bud Light",
                "description": "American Light Lager"
            }
        },
        {
            "Domestic Bottles": {
                "id": "9",
                "item_name": "Stone IPA",
                "description": "India Pale Ale.<em> Escondido, Colo."
            }
        }
    ]
},
{
    "category": "Wine",
    "category_list": [...]
}
]

这可能工作,但我希望它加入类似的键(即:Draft Beer)到相同的数组。当我json_encode($subcategory_data)时,它确实这样做了,如下所示,但它没有被分成类别,只是子类别。

[
{
    "subcategory": "Draft Beer",
    "subcategory_list": [
        {
            "id": "1",
            "item_name": "Yuengling",
            "description": "Lager. Pottstown, Pa."
        },
        {
            "id": "6",
            "item_name": "Bud Light",
            "description": "American Light Lager. Milwaukee, Wisc."
        }
    ]
},
{
    "subcategory": "Red Wine",
    "subcategory_list": [
        {
            "id": "17",
            "item_name": "Kendall-Jackson",
            "description": "Cabernet Sauvignon, 2010."
        },
        {
            "id": "18",
            "item_name": "Sanford",
            "description": "Pinot Noir, 2011. Lompoc, Calif"
        }
    ]
},
{
    "subcategory": "Domestic Bottles",
    "subcategory_list": [
        {
            "id": "9",
            "item_name": "Stone IPA",
            "description": "India Pale Ale. Escondido, Colo."
        },
        {
            "id": "10",
            "item_name": "Blue Moon",
            "description": "Belgian-style Wheat Ale."
        }
    ]
}
]

所以我的问题是为什么它合并在第二组数据而不是第一组数据。如何将subcategory_data转换为category_data。任何帮助我都非常感激。下面是一个例子,如果我正在寻找:

{
    "category_name":"Beer",
    "category_list" : [
        {
            "subcategory_name": "Draft Beer",
            "subcategory_list": [
            {
                "id": "1",
                "item_name": "Yuengling",
                "description": "Lager. Pottstown, Pa."
            },
            {
                "id": "6",
                "item_name": "Bud Light",
                "description": "American Light Lager. Milwaukee, Wisc."
            }
        }
    ]   
},
{
    "category_name":"Wine",
    "category_list" : [
        {
            "subcategory_name": "Red Wine",
            "subcategory_list": [...]
        }
    ]
}

感谢寻找,我是相当新的PHP和我依靠我的javascript技能。

首先,尝试var_dump($categories)。您将看到您正在构建一个相当奇怪的数据结构(您有一个包含1个元素的数组…)。以下代码将构建一个更简单的结构:

$categories[$row['category']][$row['subcategory']][] = array(
  'id'                 => $row['id'],
  'item_name'          => $row['item_name'],
  'description'        => $row['description'],
  'price'              => $row['price'],
  );

这将序列化为JSON,这可能是可以接受的:

{
  "Beer": {
    "Draft Beer": [
      {
        "id": "1",
        "item_name": "Yuengling",
        "description": "Lager. Pottstown, Pa."
      },
      {
        "id": "6",
        "item_name": "Bud Light",
        "description": "American Light Lager. Milwaukee, Wisc."
      }
    ],
    ...

一个额外的转换以您要求的格式获取数据:

foreach ($categories as $category_name => $subcategories) {
  $subcategory_data = array();
  foreach ($subcategories as $subcategory_name => $items) {
    $subcategory_data[] = array(
      'subcategory_name' => $subcategory_name,
      'subcategory_list' => $items
      );
  }
  $category_data[] = array(
    'category_name' => $category_name,
    'category_items' => $subcategory_data
    );                 
}