如何在PHP foreach循环中整合第三段SQL查询的device_id数据?
解决方案
步骤1:预构建设备ID映射表
先把tb_device_gate_record的数据按vip_id做索引,方便后续快速匹配,避免循环嵌套导致性能损耗:
// 假设已从tb_device_gate_record查询到数据并存入$gateRecords数组 $deviceMap = []; foreach ($gateRecords as $gateItem) { // 以vip_id为键,存储对应的device_id $deviceMap[$gateItem['vip_id']] = $gateItem['device_id']; }
步骤2:在循环中整合device_id
遍历生成masterlist和sublist时,通过员工的id(对应gate表的vip_id)直接从映射表中取device_id:
// 假设遍历员工信息的主循环 foreach ($employeeList as $emp) { // 生成masterlist项 $masterlist[] = [ 'id' => $emp['id'], 'name' => $emp['name'], 'department' => $emp['department'], // 匹配device_id,无对应值则设为null或空字符串 'device_id' => $deviceMap[$emp['id']] ?? null, // 其他原有字段... ]; // 生成sublist项(假设关联了考勤记录) foreach ($empAttRecords[$emp['id']] as $att) { $sublist[] = [ 'emp_id' => $emp['id'], 'att_time' => $att['record_time'], 'status' => $att['status'], 'device_id' => $deviceMap[$emp['id']] ?? null, // 其他原有字段... ]; } }
可选优化:SQL层面直接关联
如果业务允许,也可以直接在SQL查询时关联三张表,减少PHP端的处理逻辑:
SELECT ei.id, ei.name, ei.department, ar.record_time, ar.status, gdr.device_id FROM tb_employees_info ei LEFT JOIN tb_att_record ar ON ei.id = ar.emp_id LEFT JOIN tb_device_gate_record gdr ON ei.id = gdr.vip_id
内容的提问来源于stack exchange,提问作者Kah Kheng
相关产品推荐
相关产品推荐

