You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用PHP结合MySQL实现返回指定嵌套数组结构的Web服务?

PHP + MySQL 构建指定嵌套数组结构的Web服务

嘿,我看你需要用PHP结合MySQL开发Web服务,返回特定的嵌套数组结构对吧?刚好你给出了当前的结构和期望结果,先提个小细节:你写的期望结构里data是数组但包含键值对是不符合JSON语法的,所以我默认帮你统一把product部分都转成数组格式,同时外层如果需要从关联数组转成纯索引数组也准备了方案。

1. 先搞定数据库查询(假设表结构)

首先假设你的数据库里有三张关联表:

  • categories:主分类表(对应你结构里的键2、3)
  • sub_categories:子分类表(对应sub_category_id 1、2)
  • products:产品表(关联子分类)

用JOIN语句一次性拉取所有关联数据,这样后续处理更方便:

<?php
// 数据库连接(记得替换成你的实际信息)
$pdo = new PDO('mysql:host=localhost;dbname=your_database', 'your_username', 'your_password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 关联查询所有数据,按分类排序
$query = "
    SELECT 
        c.id AS category_id,
        sc.id AS sub_category_id,
        p.id AS product_id,
        p.name AS product_name
    FROM categories c
    JOIN sub_categories sc ON c.id = sc.category_id
    JOIN products p ON sc.id = p.sub_category_id
    ORDER BY c.id, sc.id, p.id
";
$stmt = $pdo->prepare($query);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>

2. 构建目标嵌套结构

接下来把查询到的扁平数据整理成你要的嵌套格式,重点是统一product为数组,避免有的是数组有的是关联数组的情况:

<?php
$output = ['data' => []];

foreach ($results as $row) {
    $categoryId = $row['category_id'];
    $subCategoryId = $row['sub_category_id'];
    
    // 初始化当前主分类的条目
    if (!isset($output['data'][$categoryId])) {
        $output['data'][$categoryId] = [
            'sub_category_id' => $subCategoryId,
            'product' => []
        ];
    }
    
    // 把产品添加到对应分类的product数组里
    $output['data'][$categoryId]['product'][] = [
        'sub_category_id' => $subCategoryId,
        'product_id' => $row['product_id'],
        'product_name' => $row['product_name']
    ];
}

// 如果需要把外层的data从关联数组转成纯索引数组(去掉2、3这些键),就取消下面这行注释
// $output['data'] = array_values($output['data']);

// 输出JSON格式的响应
header('Content-Type: application/json');
echo json_encode($output, JSON_PRETTY_PRINT);
?>

3. 如果已经有原始结构,直接修正格式

要是你已经拿到了原始的嵌套数组,只是需要转换成期望的格式,可以用这段代码来调整:

<?php
// 假设$originalData是你现有的原始数据
$originalData = [
    "data" => [
        "2" => [
            "sub_category_id" => "1",
            "product" => [
                ["sub_category_id" => "1", "product_id" => "1", "product_name" => "American"],
                ["sub_category_id" => "1", "product_id" => "34", "product_name" => "Ausi Product"]
            ]
        ],
        "3" => [
            "sub_category_id" => "2",
            "product" => [
                "2" => ["sub_category_id" => "2", "product_id" => "2", "product_name" => "Canadian"]
            ]
        ]
    ]
];

// 修正结构
$fixedData = ['data' => []];
foreach ($originalData['data'] as $categoryKey => $categoryItem) {
    $fixedItem = $categoryItem;
    // 检查product是不是关联数组,如果是就转成索引数组
    if (is_array($fixedItem['product']) && !array_is_list($fixedItem['product'])) {
        $fixedItem['product'] = array_values($fixedItem['product']);
    }
    $fixedData['data'][$categoryKey] = $fixedItem;
    
    // 如果要把外层转成索引数组,就用下面这行替代上面的赋值
    // $fixedData['data'][] = $fixedItem;
}

// 输出修正后的JSON
header('Content-Type: application/json');
echo json_encode($fixedData, JSON_PRETTY_PRINT);
?>

这样运行后,你就能得到符合要求的结构啦~

内容的提问来源于stack exchange,提问作者Mangesh Ukade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:25:20