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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 19:07:48