如何根据子数组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
相关产品推荐
相关产品推荐

