PHP:将关联数组转换为索引数组的完整示例

处理之前的数据

头和行在一起显示

javascript 复制代码
// 执行SQL查询后的原始数据(假设查询返回3条记录)
$rawData = [
    [
        'wip_entity_name' => 'JOB001',
        'primary_item' => 'ITEM001',
        'primary_name' => '主产品1',
        'primary_desc' => '主产品描述1',
        'start_quantity' => 100,
        'quantity_completed' => 50,
        'segment1' => 'COMP001',
        'item_name' => '组件1',
        'item_desc' => '组件1描述',
        'operation_seq_num' => 10,
        'required_quantity' => 2
    ],
    [
        'wip_entity_name' => 'JOB001',
        'primary_item' => 'ITEM001',
        'primary_name' => '主产品1',
        'primary_desc' => '主产品描述1',
        'start_quantity' => 100,
        'quantity_completed' => 50,
        'segment1' => 'COMP002',
        'item_name' => '组件2',
        'item_desc' => '组件2描述',
        'operation_seq_num' => 20,
        'required_quantity' => 1
    ],
    [
        'wip_entity_name' => 'JOB002',
        'primary_item' => 'ITEM002',
        'primary_name' => '主产品2',
        'primary_desc' => '主产品描述2',
        'start_quantity' => 200,
        'quantity_completed' => 80,
        'segment1' => 'COMP003',
        'item_name' => '组件3',
        'item_desc' => '组件3描述',
        'operation_seq_num' => 30,
        'required_quantity' => 5
    ]
];

// 原始数据对应的JSON表示
/*
[
    {
        "wip_entity_name": "JOB001",
        "primary_item": "ITEM001",
        "primary_name": "主产品1",
        "primary_desc": "主产品描述1",
        "start_quantity": 100,
        "quantity_completed": 50,
        "segment1": "COMP001",
        "item_name": "组件1",
        "item_desc": "组件1描述",
        "operation_seq_num": 10,
        "required_quantity": 2
    },
    {
        "wip_entity_name": "JOB001",
        "primary_item": "ITEM001",
        "primary_name": "主产品1",
        "primary_desc": "主产品描述1",
        "start_quantity": 100,
        "quantity_completed": 50,
        "segment1": "COMP002",
        "item_name": "组件2",
        "item_desc": "组件2描述",
        "operation_seq_num": 20,
        "required_quantity": 1
    },
    {
        "wip_entity_name": "JOB002",
        "primary_item": "ITEM002",
        "primary_name": "主产品2",
        "primary_desc": "主产品描述2",
        "start_quantity": 200,
        "quantity_completed": 80,
        "segment1": "COMP003",
        "item_name": "组件3",
        "item_desc": "组件3描述",
        "operation_seq_num": 30,
        "required_quantity": 5
    }
]
*/

处理之后的数据

将同样的头规整到一起显示

javascript 复制代码
{
    "status": "success",
    "message": "数据获取成功",
    "data": [
        {
            "wip_entity_name": "JOB001",
            "primary_item": "ITEM001",
            "primary_name": "主产品1",
            "primary_desc": "主产品描述1",
            "start_quantity": 100,
            "quantity_completed": 50,
            "lines": [
                {
                    "segment1": "COMP001",
                    "item_name": "组件1",
                    "item_desc": "组件1描述",
                    "operation_seq_num": 10,
                    "required_quantity": 2
                },
                {
                    "segment1": "COMP002",
                    "item_name": "组件2",
                    "item_desc": "组件2描述",
                    "operation_seq_num": 20,
                    "required_quantity": 1
                }
            ]
        },
        {
            "wip_entity_name": "JOB002",
            "primary_item": "ITEM002",
            "primary_name": "主产品2",
            "primary_desc": "主产品描述2",
            "start_quantity": 200,
            "quantity_completed": 80,
            "lines": [
                {
                    "segment1": "COMP003",
                    "item_name": "组件3",
                    "item_desc": "组件3描述",
                    "operation_seq_num": 30,
                    "required_quantity": 5
                }
            ]
        }
    ]
}

代码

php 复制代码
<?php
// 这里只写数据库部分-查出全部的数据头和行数据
$sql = "SELECT 
            a.wip_entity_name,
            a.primary_item,
            c.item_name AS primary_name,
            c.item_desc AS primary_desc,
            a.start_quantity,
            a.quantity_completed,
            d.segment1,
            e.item_name,
            e.item_desc,
            d.operation_seq_num,
            d.required_quantity 
        FROM 
            wip_jobs_all a
            JOIN sf_item_no c ON a.primary_item = c.item_no
            JOIN wip_material_requierments d ON a.wip_entity_name = d.wip_entity_name
            JOIN sf_item_no e ON d.segment1 = e.item_no
        WHERE 1=1";
// 执行查询
$result = mysqli_query($conn, $sql);
//数据库查询错误提示
if (!$result) {
    // 查询失败处理
    $response = [
        'status' => 'error',
        'message' => '查询失败: ' . mysqli_error($conn),
        'data' => []
    ];
    echo json_encode($response);
    exit;
}
// 处理查询结果
//定义一个空数组
$groupedData = [];
while ($row = mysqli_fetch_assoc($result)) {
    //以wip_entity_name作为唯一的键名
    $wipEntity = $row['wip_entity_name'];
    // 如果该工单尚未初始化,创建头部信息
    if (!isset($groupedData[$wipEntity])) {
        $groupedData[$wipEntity] = [
            'wip_entity_name' => $row['wip_entity_name'],
            'primary_item' => $row['primary_item'],
            'primary_name' => $row['primary_name'],
            'primary_desc' => $row['primary_desc'],
            'start_quantity' => $row['start_quantity'],
            'quantity_completed' => $row['quantity_completed'],
            'lines' => []
        ];
    }
    // 添加行项目数据
    $groupedData[$wipEntity]['lines'][] = [
        'segment1' => $row['segment1'],
        'item_name' => $row['item_name'],
        'item_desc' => $row['item_desc'],
        'operation_seq_num' => $row['operation_seq_num'],
        'required_quantity' => $row['required_quantity']
    ];
}

// 释放结果集
mysqli_free_result($result);

// 将关联数组转换为索引数组(兼容所有PHP版本)
$finalData = array_values($groupedData);

// 构建响应
$response = [
    'status' => 'success',
    'message' => '数据获取成功',
    'data' => $finalData
];

// 设置JSON头并输出响应
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE);

// 关闭数据库连接
mysqli_close($conn);
?>
相关推荐
祖国的好青年7 分钟前
VS Code 搭建 React Native 开发环境(Windows 实战指南)
android·windows·react native·react.js
nbwenren19 分钟前
办公AI实测:Gemini3、GPT-4o、Claude3.5谁更强?
服务器·数据库·php
杨云龙UP25 分钟前
Oracle数据库启动失败:ORA-29701、ORA-01565、ORA-17503故障处理记录_20260429
linux·运维·数据库·oracle·centos
黄林晴34 分钟前
警惕!AGP 9.2 别只改版本号,R8 规则与构建链路全线收紧
android·gradle
小米渣的逆袭1 小时前
Android ADB 完全使用指南
android·adb
hopetomorrow1 小时前
学习路之PHP --PHP 常用扩展及作用表
开发语言·学习·php
儿歌八万首1 小时前
Jetpack Compose Canvas 进阶:结合 animateFloatAsState 让自定义图形动起来
android·动画·compose
懒铭心1 小时前
Oracle 19c 备份与恢复
oracle
于歌8521 小时前
Oracle批处理操作方法
数据库·oracle
幽络源小助理2 小时前
影视脚本分镜在线协作系统源码 PHP剧本创作平台
开发语言·php