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

PHP按已缴费月份排序月度缴费数据实现表格正确展示

需求说明

需要按自然月份顺序展示客户月度缴费数据,已缴费月份展示对应缴费信息,未缴费月份留空,期望效果如下:
示例效果图1

原代码运行后出现大量重复空行,不符合预期,错误效果如下:
当前运行效果图2

数据库缴费表存储结构参考:
数据库表内容图3

问题根源

原代码循环逻辑完全颠倒:

  • 外层遍历每一条单独的缴费记录,内层遍历全部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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:06:30