PHP多维数组多列条件对比:获取重复项中日期最早的元素
PHP多维数组多列条件对比:获取重复项中日期最早的元素
嘿,我懂你现在的需求啦——你已经通过compare字段把type、currency、cost这三个字段都相同的项归为了一组,现在就差从每组里挑出日期最早的那个元素对吧?我给你分享两个实用的PHP实现方案,你可以根据自己的场景选:
方案一:遍历分组+实时日期对比(高效首选)
这个方法只需要一次遍历就能完成,效率很高,逻辑也清晰:我们用compare的值作为分组键,遍历原数组时,每个组只保留日期最早的元素。
// 假设你的原数组是$originalArray $uniqueItems = []; foreach ($originalArray as $item) { $compareKey = $item['compare']; // 如果当前分组还没存入元素,直接添加 if (!isset($uniqueItems[$compareKey])) { $uniqueItems[$compareKey] = $item; } else { // 对比当前元素和已存元素的日期,保留更早的那个 if (strtotime($item['date']) < strtotime($uniqueItems[$compareKey]['date'])) { $uniqueItems[$compareKey] = $item; } } } // 把关联数组转回索引数组(和原数组格式一致) $result = array_values($uniqueItems);
说明
- 核心思路是用
compare值做分组标识,每个分组只留存日期最早的元素; strtotime()用来把日期字符串转成时间戳,方便数值对比;- 最后用
array_values()把分组后的关联数组转成普通索引数组,和原数组结构保持一致,方便后续操作。
方案二:先排序再分组(简单易读)
如果你的数组数据量不大,也可以先把整个数组按日期升序排序,这样日期最早的元素会排在每组的最前面,之后再分组时直接取每组第一个元素即可:
// 先按日期升序排序,更早的日期排在前面 usort($originalArray, function($a, $b) { return strtotime($a['date']) - strtotime($b['date']); }); // 分组取每组第一个元素(也就是日期最早的) $uniqueItems = []; foreach ($originalArray as $item) { $compareKey = $item['compare']; if (!isset($uniqueItems[$compareKey])) { $uniqueItems[$compareKey] = $item; } } $result = array_values($uniqueItems);
说明
usort()是PHP的自定义排序函数,这里用匿名函数实现了按日期升序排序;- 排序后同组的元素里,最早的日期项会先被遍历到,所以只需要存一次就够了,后续同组元素直接跳过。
额外小技巧
其实你也可以不用提前生成compare字段,直接在分组时把三个字段拼接成键,比如:
$compareKey = $item['type'] . '-' . $item['currency'] . '-' . $item['cost'];
这样可以省掉预处理数组生成compare列的步骤,直接完成分组,看你自己的习惯选择就行~
备注:内容来源于stack exchange,提问作者dchristof
相关产品推荐
相关产品推荐

