PHP技术问询:如何将多列SQL查询结果转为指定结构数组
问题与解决方案
原始数据表
| login | time_start |
|---|---|
| name1 | 17:30:00 |
| name2 | 18:15:00 |
| name3 | 16:30:00 |
| name2 | 17:30:00 |
需求
将上述数据转换为以time_start为键,对应所有关联login的数组,目标结构如下:
Array ( [ 18:15:00 ] => Array ( [login] => name2 ) [ 17:30:00 ] => Array ( [login] => (name1, name2) ) [ 16:30:00 ] => Array ( [login] => name3 ) )
尝试的代码及问题
你当前使用的代码:
if ($result && $result->num_rows > 0) { while($row = $result->fetch_assoc()) { $aReturn[$row['time_start']] = array( 'login' => $row['login'] ); } }
运行后仅保留每个时间点的最后一条login记录,结果如下:
Array ( [16:30:00] => Array ( [login] => name3 ) [17:30:00] => Array ( [login] => name2 ) [18:15:00] => Array ( [login] => name2 ) )
问题出在:每次循环到相同time_start的行时,都会直接覆盖该键对应的数组值,导致之前的login记录被丢弃。
修正后的代码
推荐分两步处理,先收集所有数据再格式化,逻辑更清晰:
if ($result && $result->num_rows > 0) { $tempData = []; $aReturn = []; // 第一步:按时间分组收集所有login while($row = $result->fetch_assoc()) { $time = $row['time_start']; $tempData[$time][] = $row['login']; } // 第二步:转换为目标格式 foreach ($tempData as $time => $loginList) { if (count($loginList) > 1) { $aReturn[$time] = [ 'login' => '(' . implode(', ', $loginList) . ')' ]; } else { $aReturn[$time] = [ 'login' => $loginList[0] ]; } } }
代码说明
- 先用
$tempData按time_start分组,把同一时间的所有login存到数组里 - 遍历
$tempData,根据每组login的数量决定格式:- 只有1个时直接赋值
- 多个时用括号包裹,逗号分隔拼接成字符串
这样就能得到你需要的目标数组结构。
内容的提问来源于stack exchange,提问作者Mikołaj Sala
相关产品推荐
相关产品推荐

