无法使用PHP构建嵌套JSON

时间:2014-07-09 19:50:48

标签: php arrays json merge

我无法正确嵌套这些数组。我从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。任何帮助ID真的很感激。下面是一个例子,如果我正在寻找:

{
    "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技能。

1 个答案:

答案 0 :(得分:1)

首先,试试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
    );                 
}