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

如何根据子数组TransDate将多维数组按60分钟间隔拆分?

实现方案:按60分钟时间间隔分组交易记录

这是一个很常见的时间分组需求,我来给你提供一个PHP的实现方案,完全符合你给出的示例要求:

1. 完整代码实现

首先我们先定义原始数组,然后进行分组处理:

<?php
// 原始交易数组
$transactions = [
    ["TransDate" => "2019-10-28 08:31:02", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 09:09:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 09:17:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 09:30:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 09:35:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 10:50:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 10:58:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 10:58:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 11:40:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 11:49:14", "Amount" => "12.00"],
    ["TransDate" => "2019-10-28 23:50:14", "Amount" => "12.00"],
];

// 可选:如果原始数组未按时间排序,先执行排序
usort($transactions, function($a, $b) {
    return strtotime($a['TransDate']) - strtotime($b['TransDate']);
});

// 初始化分组变量
$groups = [];
$currentGroup = [];

foreach ($transactions as $transaction) {
    $currentTimestamp = strtotime($transaction['TransDate']);
    
    if (empty($currentGroup)) {
        // 当前组为空,直接加入第一个元素
        $currentGroup[] = $transaction;
    } else {
        // 获取当前组第一个元素的时间戳
        $groupFirstTimestamp = strtotime($currentGroup[0]['TransDate']);
        // 计算时间差(单位:秒)
        $timeDiff = $currentTimestamp - $groupFirstTimestamp;
        
        if ($timeDiff <= 3600) { // 60分钟 = 3600秒
            $currentGroup[] = $transaction;
        } else {
            // 超过60分钟,保存当前组并开启新组
            $groups[] = $currentGroup;
            $currentGroup = [$transaction];
        }
    }
}

// 保存最后一个未完成的组
if (!empty($currentGroup)) {
    $groups[] = $currentGroup;
}

// 输出验证结果
print_r($groups);
?>

2. 代码逻辑说明

  • 初始化变量:$groups用来存储最终的所有分组,$currentGroup临时存储正在构建的当前组。
  • 时间转换:使用strtotime()将字符串时间转换为时间戳,方便计算时间差。
  • 分组规则:
    • 当currentGroup为空时,直接将当前交易加入作为组的第一个元素。
    • 对于后续交易,计算其与当前组第一个元素的时间差:
      • 如果差值≤3600秒(60分钟),则加入当前组;
      • 如果差值超过60分钟,将当前组存入$groups,并新建一个组存放当前交易。
  • 收尾处理:遍历结束后,将最后一个未存入的组加入$groups,避免遗漏。

3. 注意事项

如果你的原始交易数组不是按时间顺序排列的,一定要先执行usort()排序,否则分组逻辑会失效——因为我们的分组是基于组内第一个元素的时间基准来判断的,乱序的话会导致错误的分组结果。

运行这段代码后,你会得到和你期望完全一致的分组结果。

内容的提问来源于stack exchange,提问作者WatsMyName

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 13:42:41