如何在CodeIgniter3中按air_id分组MySQL航班数据并遍历展示
问题描述
我有一个存储航班数据的MySQL表,使用CodeIgniter 3编写PHP代码来分组展示数据。表结构及数据如下:
| journey_id | air_id | FlightDuration | out_or_in | flightduration2 |
|---|---|---|---|---|
| 1 | 1 | 20hr 5min | outbound | 1205 |
| 2 | 1 | 20hr 5min | outbound | 1300 |
| 3 | 1 | 17hr 55min | inbound | 2258 |
| 4 | 1 | 17hr 55min | inbound | 1075 |
| 5 | 2 | 31hr 40min | outbound | 1970 |
| 6 | 2 | 31hr 40min | outbound | 1900 |
| 7 | 2 | 17hr 55min | inbound | 2223 |
| 8 | 2 | 17hr 55min | inbound | 1987 |
| 9 | 3 | 10hr 45min | outbound | 645 |
| 10 | 3 | 11hr 25min | inbound | 685 |
我用$this->db->get()获取数据后可以遍历,但每行都是单独数组,难以按air_id分组。因为需要保留每一行数据,不能用MySQL的GROUP BY。希望最终展示格式如下:
air_id - 1 20hr 5min outbound 1205 20hr 5min outbound 1300 17hr 55min inbound 2258 17hr 55min inbound 1075 air_id - 2 31hr 40min outbound 1970 31hr 40min outbound 1900 17hr 55min inbound 2223 17hr 55min inbound 1987 air_id - 3 10hr 45min outbound 645 11hr 25min inbound 685
请问按air_id分组数据以便遍历的最佳方式是什么?
解决方案
你可以在获取数据后,通过PHP将数组按air_id重组,之后再遍历重组后的数组来实现分组展示,步骤如下:
1. 获取原始数据
首先从数据库中获取所有航班数据,建议先按air_id排序,这样重组时更高效:
// 在控制器或模型中执行 $this->db->order_by('air_id', 'ASC'); $query = $this->db->get('your_flight_table'); $flights = $query->result_array(); // 获取关联数组格式的结果集
2. 按air_id重组数组
遍历原始数据,将同一air_id的行归类到同一个子数组中:
$grouped_flights = []; foreach ($flights as $flight) { $air_id = $flight['air_id']; // 初始化当前air_id对应的数组(如果未存在) if (!isset($grouped_flights[$air_id])) { $grouped_flights[$air_id] = []; } // 将当前航班数据加入对应分组 $grouped_flights[$air_id][] = $flight; }
3. 遍历分组后的数据并输出
现在可以遍历重组后的数组,按需求格式输出:
foreach ($grouped_flights as $air_id => $flight_list) { // 输出air_id分组标题 echo "air_id - {$air_id}\n"; // 遍历当前分组下的所有航班 foreach ($flight_list as $flight) { echo "{$flight['FlightDuration']}\t{$flight['out_or_in']}\t{$flight['flightduration2']}\n"; } // 分组间添加换行分隔 echo "\n"; }
如果是在视图文件中输出,建议用<pre>标签保留格式:
<pre> <?php foreach ($grouped_flights as $air_id => $flight_list): ?> air_id - <?php echo $air_id; ?> <?php foreach ($flight_list as $flight): ?> <?php echo $flight['FlightDuration'] . "\t" . $flight['out_or_in'] . "\t" . $flight['flightduration2']; ?> <?php endforeach; ?> <?php endforeach; ?> </pre>
补充说明
- 提前用
order_by('air_id', 'ASC')排序,能让原始数据按air_id顺序排列,重组后的数组自然有序,无需额外排序。 - 这种方式完整保留了所有原始行数据,完美避开MySQL GROUP BY丢失数据的问题。
内容的提问来源于stack exchange,提问作者LiveEn
相关产品推荐
相关产品推荐

