PHP按已缴费月份排序月度缴费数据实现表格正确展示
需求说明
需要按自然月份顺序展示客户月度缴费数据,已缴费月份展示对应缴费信息,未缴费月份留空,期望效果如下:
原代码运行后出现大量重复空行,不符合预期,错误效果如下:
数据库缴费表存储结构参考:
问题根源
原代码循环逻辑完全颠倒:
- 外层遍历每一条单独的缴费记录,内层遍历全部12个月份
- 每处理1条缴费记录就会生成12行表格,有N条缴费记录就会输出N*12行内容,直接导致大量无意义空行
- 重复在循环内执行全量月份查询,存在不必要的数据库性能损耗
修复方案
调整循环层级,以自然月份为遍历基准,提前整理缴费记录映射做快速匹配:
- 提前一次性查询所有月份,按
month_id升序排序,保证行顺序符合1-12月的自然顺序 - 预处理客户缴费记录,生成以月份ID为键的映射数组,避免循环内重复查库、重复匹配
- 外层逐个遍历月份,每个月份仅生成1行表格:匹配到缴费记录就填充缴费数据,未匹配到则留空
修复后代码如下:
<?php // 提前一次性获取所有月份,按月份ID升序保证展示顺序正确 $listmonths = $this->db->order_by('month_id', 'ASC')->get('tb_months')->result_array(); // 预处理缴费记录,生成[月份ID => 缴费记录]的映射数组,方便快速匹配 $paidMap = []; foreach($clientid as $cid){ $paidMap[$cid['ps_month']] = $cid; } ?> <!-- 外层遍历月份,每个月份仅生成1行表格 --> <?php foreach($listmonths as $lm): ?> <tr> <td><?php echo $lm['month_name']; ?></td> <?php if(isset($paidMap[$lm['month_id']])): $currentPaid = $paidMap[$lm['month_id']]; ?> <td><?php echo date('d/m/Y', strtotime($currentPaid['ps_date'])); ?></td> <td><?php echo $currentPaid['ps_total']; ?></td> <!-- 其余业务列根据实际需求填充即可 --> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <?php else: ?> <!-- 未缴费月份,对应列留空 --> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <td></td> <?php endif; ?> </tr> <?php endforeach; ?>
修复后效果
- 无重复空行,每个月份对应1行表格
- 顺序严格按照自然月份排列,已缴费数据自动填充到对应月份行
- 去掉循环内重复查询,数据库访问次数减少,执行效率更高
内容的提问来源于stack exchange,提问作者Ahmed554
相关产品推荐
相关产品推荐

