
本文介绍如何在 php 中高效去除关联数组中的重复项(以 name 为判断依据),同时确保每组重复数据中仅保留 createdat 时间戳最大的那条记录。
本文介绍如何在 php 中高效去除关联数组中的重复项(以 name 为判断依据),同时确保每组重复数据中仅保留 createdat 时间戳最大的那条记录。
在实际开发中,常遇到从数据库或 API 获取的原始数据存在逻辑重复(如相同产品名但不同版本/时间戳),而业务要求只保留“最新”的一条记录。此时,简单使用 array_unique() 无法满足需求,因为它仅支持全量值比对或指定键的浅层去重,无法结合时间优先级进行智能筛选。
推荐采用单次遍历 + 哈希映射更新策略:以唯一标识字段(如 'name')作为临时键,逐条检查当前元素的 createdAt 是否大于已存记录的时间戳;若是,则覆盖;最终通过 array_values() 重置数字索引,获得规范的纯索引数组。
以下为完整可运行示例代码:
<?php
$arr = [
[
"id" => '6230061c0e88d709ca0d7bbc',
'name' => 'Mobile SamSung',
'slug' => 'mobile-samsung',
'createdAt' => '1648006346'
],
[
"id" => '5d1eff529a426778d4b92383',
'name' => 'Mobile Iphone',
'slug' => 'mobile-iphone',
'createdAt' => '1647314181'
],
[
"id" => '5d1eff6b9a426778d4b92dc4',
'name' => 'Mobile SamSung',
'slug' => 'mobile-samsung',
'createdAt' => '1647314460'
],
[
"id" => '5f894011266aea580b028cb0',
'name' => 'Mobile LG',
'slug' => 'mobile-lg',
'createdAt' => '1647314456'
]
];
$result = [];
foreach ($arr as $row) {
$key = $row['name']; // 使用 name 作为去重维度
$currentTs = (int)$row['createdAt'];
// 若该 name 尚未存在,或当前时间戳更大,则更新
if (!isset($result[$key]) || $currentTs > (int)$result[$key]['createdAt']) {
$result[$key] = $row;
}
}
// 重置索引,返回标准数值索引数组
$final = array_values($result);
print_r($final);✅ 关键优势说明:
立即学习“PHP免费学习笔记(深入)”;
- 时间复杂度 O(n):仅需一次遍历,避免嵌套循环或多次 array_filter 调用;
- 内存友好:无需生成中间数组或额外排序;
- 灵活可扩展:只需修改 $key 和比较字段(如换成 'slug' 或 'id' 的哈希前缀),即可适配其他业务场景;
- 类型安全:显式转换 (int) 防止字符串时间戳误判(如 '1647314460' > '1648006346' 在字符串比较下为 false)。
⚠️ 注意事项:
- 确保 createdAt 字段为 Unix 时间戳格式(整数或数字字符串),否则需先用 strtotime() 标准化;
- 若存在大小写敏感问题(如 'Mobile samsung' 与 'Mobile SamSung'),建议统一转为小写后再作为 $key:$key = strtolower($row['name']);;
- 该方案默认以 name 为唯一性依据;若需多字段联合去重(如 name + slug),可构造复合键:$key = $row['name'] . '|' . $row['slug'];。
此方法简洁、健壮且性能优异,适用于 Laravel、Symfony 或原生 PHP 项目中的数据清洗环节。











