如何彻底移除关联数组中所有重复项(包括原始项与副本)

酷敏大大_2252

酷敏大大_2252

2026-06-02

603人浏览

原创

如何彻底移除关联数组中所有重复项(包括原始项与副本)

本文介绍在 php 中彻底删除关联数组中所有完全重复的元素——即当某条记录的指定键(如 'user')出现多次时,整组重复数据均被剔除,仅保留唯一且无任何重复的记录。

本文介绍在 php 中彻底删除关联数组中所有完全重复的元素——即当某条记录的指定键(如 'user')出现多次时,整组重复数据均被剔除,仅保留唯一且无任何重复的记录。

在处理用户权限、日志去重或数据清洗等场景时,有时不仅需要“去重”,更需要“去净”:即只要某个标识字段(例如 'user')在数组中出现超过一次,所有对应记录都应被移除,而非仅保留首次出现项。这与 array_unique() 或常规去重逻辑有本质区别。

上述需求无法通过简单的 in_array 或 array_unique($rows, SORT_REGULAR) 实现,因为后者仅消除后续重复项,而我们需要的是“全量淘汰”重复键所关联的所有条目。

✅ 正确实现思路:两遍扫描 + 键值映射标记

核心策略是利用 PHP 关联数组的键作为“用户 ID 缓存区”,第一次遍历时:

FD Studio
FD Studio

一款AI视频创作工具,主要用于一站式AI辅助影视创意工作台,适合需要提升相关任务效率的用户。

下载
  • 若某 user 值首次出现 → 存入临时数组 $res[$user] = $row
  • 若该 user 已存在 → 立即 unset($res[$user]),将其彻底清除

最终,仅剩那些全程只出现一次的用户记录保留在 $res 中,再通过 array_values() 重置数字索引即可。

$rows = [
    ['user' => 1, 'access' => '342'],
    ['user' => 2, 'access' => '765'],
    ['user' => 3, 'access' => '134'],
    ['user' => 1, 'access' => '342']
];

$res = [];
foreach ($rows as $row) {
    $key = $row['user']; // 提取去重依据字段(可替换为其他键,如 'id'、'email')
    if (isset($res[$key])) {
        unset($res[$key]); // 第二次及以上出现 → 删除已存项
    } else {
        $res[$key] = $row; // 首次出现 → 缓存
    }
}

// 重置索引并输出标准 JSON 格式
$result = array_values($res);
echo json_encode($result, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

输出结果:

[
    {
        "user": 2,
        "access": "765"
    },
    {
        "user": 3,
        "access": "134"
    }
]

⚠️ 注意事项与扩展建议

  • 健壮性增强:实际使用中建议先检查 $row['user'] 是否存在,避免 Notice 错误:
    if (!isset($row['user'])) continue;
  • 多字段联合判重:若需基于多个字段(如 ['user', 'action'])判断重复,可构造复合键:
    $compositeKey = $row['user'] . '|' . $row['action'];
  • 性能考量:该算法时间复杂度为 O(n),空间复杂度也为 O(n),适用于万级以内数据;超大数据集建议改用数据库 GROUP BY + HAVING COUNT = 1 处理。
  • 不可用于非标量键:$res[$key] 要求 $key 必须是字符串或整数,不支持数组或对象作为键。

此方法简洁、高效、无需额外扩展,是 PHP 原生环境下实现“双向去重”的推荐方案。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

20

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

20

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

20

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

0

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

20

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

20

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

100

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

20

16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP函数之array数组函数视频讲解
PHP函数之array数组函数视频讲解

共76课时 | 29.1万人学习