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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.17 09:34:32