PHP多维数组去重合并:相同首元素的时间值累加
刚好做过类似的需求,你这个场景核心是按子数组首元素分组+对应时间字段累加,不是单纯去重,我给你捋一遍实现思路和代码:
核心思路
- 用关联数组作为临时容器,以子数组的第一个元素为键,这样天然就能实现“去重”的效果(相同键只会保留一个条目)
- 遍历原数组时,对每个子项的时间字段做拆分、数值累加,再重新拼接成字符串
- 最后如果需要和示例一样的索引数组结构,用
array_values()重置键名即可
具体代码实现
首先定义你的原数组:
$originalArray = [ ["One", "11:31"], ["Two", "11:31"], ["Three", "11:31"], ["One", "11:31"] ];
然后是处理逻辑:
// 初始化分组容器 $groupedData = []; foreach ($originalArray as $item) { $groupKey = $item[0]; $timeStr = $item[1]; // 把时间字符串拆成可计算的两部分 list($val1, $val2) = explode(':', $timeStr); if (isset($groupedData[$groupKey])) { // 如果分组已存在,拆分已有时间并累加 list($existingVal1, $existingVal2) = explode(':', $groupedData[$groupKey][1]); $newVal1 = (int)$existingVal1 + (int)$val1; $newVal2 = (int)$existingVal2 + (int)$val2; // 更新分组的时间字段 $groupedData[$groupKey][1] = "{$newVal1}:{$newVal2}"; } else { // 分组不存在,直接添加当前项 $groupedData[$groupKey] = $item; } } // 转成索引数组(和你要的输出结构一致) $result = array_values($groupedData); // 输出结果 print_r($result);
运行这段代码后,就能得到你想要的输出:
Array ( [0] => Array ( [0] => One [1] => 22:62 ) [1] => Array ( [0] => Two [1] => 11:31 ) [2] => Array ( [0] => Three [1] => 11:31 ) )
额外优化:处理时间进位
你提到实际数据中第二个值不同,如果这个字段是标准的时分或分秒,累加后可能出现超过60的情况(比如示例里的62分),可以加个进位处理逻辑:
// 替换累加后的时间拼接部分 $total = (int)$existingVal1 * 60 + (int)$existingVal2 + (int)$val1 * 60 + (int)$val2; $newVal1 = floor($total / 60); $newVal2 = $total % 60; $groupedData[$groupKey][1] = "{$newVal1}:{$newVal2}";
这样示例里的11:31 + 11:31就会变成23:02,更符合时间逻辑。
用到的PHP函数说明
foreach:遍历数组的基础工具,逐个处理每个子项explode():将字符串按指定分隔符拆分,这里用来拆分时间字符串isset():检查分组容器中是否已存在当前键,判断是新增还是累加array_values():将关联数组转成索引数组,重置键名从0开始floor():向下取整,用于处理时间进位计算
内容的提问来源于stack exchange,提问作者Skintest
相关产品推荐
相关产品推荐

