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

发布于:2025-04-12 ⋅ 阅读:(35) ⋅ 点赞:(0)

处理之前的数据

头和行在一起显示

// 执行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
    }
]
*/

处理之后的数据

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

{
    "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
// 这里只写数据库部分-查出全部的数据头和行数据
$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);
?>


网站公告

今日签到

点亮在社区的每一天
去签到