如何在foreach循环中判断采购日期,实现同日期结果同行打印?
实现同一采购日期结果同行打印的解决方案
我来给你梳理两种可行的实现方案,帮你搞定同一采购日期的结果同行打印的需求~
方法一:先按采购日期分组(推荐,逻辑更清晰)
核心思路是先把相同采购日期的记录归为一组,再循环每组打印成一行。这样不管原数组顺序如何,都能保证同一日期的内容在同一行。
第一步:在控制器中完成分组
先对获取到的$res数组按bill_date分组:
$groupedRes = []; foreach($res as $row) { // 拿当前记录的采购日期作为分组键 $dateKey = $row['bill_date']; // 如果该日期的分组不存在,先初始化空数组 if (!isset($groupedRes[$dateKey])) { $groupedRes[$dateKey] = []; } // 将当前记录加入对应日期的分组 $groupedRes[$dateKey][] = $row; }
第二步:在视图中循环分组结果打印
现在每组对应一个采购日期,直接循环每组,把组内的所有内容拼接在同一行即可:
foreach($groupedRes as $date => $items) { // 开头先打印采购日期 echo "<div class='same-date-row'>采购日期:{$date} "; // 循环打印当前日期下的所有记录内容 foreach($items as $item) { // 这里替换成你实际要打印的字段,比如商品名、金额等 echo "商品:{$item['goods_name']},金额:{$item['amount']} | "; } echo "</div>"; }
方法二:在原循环中跟踪上一次日期(无需提前分组)
如果不想提前分组,也可以在视图循环里记录上一次的采购日期,当日期变化时切换行。但必须保证原数组已经按bill_date排序,否则相同日期的记录可能分散在不同行。
第一步:先对数组按日期排序(控制器中处理)
如果原数组未排序,先在控制器中排序:
// 按采购日期升序排序(如果是时间戳格式也可以直接比较) usort($res, function($a, $b) { return strcmp($a['bill_date'], $b['bill_date']); });
第二步:在视图中循环并跟踪日期
// 初始化变量记录上一次的采购日期 $lastPurchaseDate = null; // 先开启第一行的容器标签 echo "<div class='same-date-row'>"; foreach($res as $row) { $currentDate = $row['bill_date']; // 如果不是第一条记录,且当前日期和上一次不同,就关闭上一行并开启新行 if ($lastPurchaseDate !== null && $currentDate != $lastPurchaseDate) { echo "</div><div class='same-date-row'>"; } // 打印当前记录的内容 echo "商品:{$row['goods_name']},金额:{$row['amount']} | "; // 更新上一次的日期为当前日期 $lastPurchaseDate = $currentDate; } // 关闭最后一行的容器标签 echo "</div>";
关键注意点
- 如果你用方法二,一定要确保数组按采购日期排序,否则相同日期的记录会被拆到不同行;
- 打印的容器标签(比如
<div>)可以根据你的页面需求换成<tr>(表格行)或者其他合适的标签; - 可以根据实际需求调整每行的内容格式,比如添加分隔符、样式类等。
内容的提问来源于stack exchange,提问作者Geetha Sekar
相关产品推荐
相关产品推荐

