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

PHP技术问询:如何将多列SQL查询结果转为指定结构数组

问题与解决方案

原始数据表

logintime_start
name117:30:00
name218:15:00
name316:30:00
name217: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]
            ];
        }
    }
}

代码说明

  1. 先用$tempData按time_start分组,把同一时间的所有login存到数组里
  2. 遍历$tempData,根据每组login的数量决定格式:
    • 只有1个时直接赋值
    • 多个时用括号包裹,逗号分隔拼接成字符串

这样就能得到你需要的目标数组结构。

内容的提问来源于stack exchange,提问作者Mikołaj Sala

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:52:52