PHP中如何调整JSON数组结构?将items嵌套至对应分类对象
PHP中调整数组结构,将Items嵌套到对应分类对象中
没问题,这个需求很常见,咱们一步步来解决。首先明确你的问题:现在的JSON里,分类和对应的商品列表是分开的两个对象,你需要把商品列表(items)合并到它所属的分类对象里,变成嵌套结构。
方法一:直接处理现有数组
如果你已经拿到了像你给出的那种初始数组,完全可以在PHP里编辑调整它的结构。核心思路就是遍历数组,把相邻的分类和items配对,然后合并到同一个对象里。
这里有个具体的代码示例:
// 假设这是你从数据库获取后得到的初始数组 $originalArray = [ [ "category_id" => "1", "category_name" => "Construction Materials" ], [ "items" => [ [ "id" => "1", "item_name" => "Wire Mesh", "price" => "459", "image_url" => null ], [ "id" => "2", "item_name" => "Cement", "price" => "700", "image_url" => null ], [ "id" => "3", "item_name" => "Barbed Wire", "price" => "3000", "image_url" => null ], [ "id" => "4", "item_name" => "Iron sheet", "price" => "200", "image_url" => null ] ] ], [ "category_id" => "2", "category_name" => "Plumbing" ] ]; $processedArray = []; $currentCategory = null; // 遍历原数组,配对分类和items foreach ($originalArray as $element) { // 识别当前元素是分类对象 if (isset($element['category_id'])) { // 如果之前有未保存的分类,先加入结果数组 if ($currentCategory !== null) { $processedArray[] = $currentCategory; } // 把当前分类设为待处理的对象 $currentCategory = $element; } // 识别当前元素是items数组,且有对应的分类 elseif (isset($element['items']) && $currentCategory !== null) { // 直接给分类对象添加items字段 $currentCategory['items'] = $element['items']; } } // 别忘了把最后一个分类加入结果 if ($currentCategory !== null) { $processedArray[] = $currentCategory; } // 输出格式化后的JSON echo json_encode($processedArray, JSON_PRETTY_PRINT);
这段代码会输出你期望的结构——items被嵌套到了对应的分类对象里。PHP里数组是可变的,你完全可以通过$数组['新键名'] = 值的方式给数组元素添加新字段,就像上面的$currentCategory['items'] = $element['items']这样操作。
方法二:从数据库查询时直接构建目标结构
其实更推荐的是从源头解决,也就是查询数据库的时候就直接组装成你想要的嵌套结构,这样效率更高,不用二次处理数组。
假设你有categories(分类表)和items(商品表),商品表有category_id外键关联分类表,你可以这样做:
// 初始化数据库连接(根据你的实际情况修改) $pdo = new PDO('mysql:host=localhost;dbname=your_database', 'your_username', 'your_password'); // 查询分类和对应的商品,用LEFT JOIN确保没有商品的分类也能被返回 $stmt = $pdo->query(" SELECT c.category_id, c.category_name, i.id, i.item_name, i.price, i.image_url FROM categories c LEFT JOIN items i ON c.category_id = i.category_id ORDER BY c.category_id "); $processedArray = []; $currentCatId = null; $currentCategory = []; // 遍历查询结果,组装嵌套结构 while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { // 遇到新的分类 if ($row['category_id'] !== $currentCatId) { // 把之前的分类加入结果数组 if ($currentCatId !== null) { $processedArray[] = $currentCategory; } // 初始化新分类的结构 $currentCatId = $row['category_id']; $currentCategory = [ 'category_id' => $row['category_id'], 'category_name' => $row['category_name'], 'items' => [] ]; } // 如果当前行有商品数据,就加入分类的items数组 if (!is_null($row['id'])) { $currentCategory['items'][] = [ 'id' => $row['id'], 'item_name' => $row['item_name'], 'price' => $row['price'], 'image_url' => $row['image_url'] ]; } } // 加入最后一个分类 if ($currentCatId !== null) { $processedArray[] = $currentCategory; } // 输出JSON echo json_encode($processedArray, JSON_PRETTY_PRINT);
这种方式直接从数据库结果组装,避免了后续的数组调整,代码更简洁高效。
内容的提问来源于stack exchange,提问作者Alfred
相关产品推荐
相关产品推荐

