如何用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
相关产品推荐
相关产品推荐

