0

0

PHP高性能计算函数array_unique去重慢_去重高效实现技巧【技巧】

蓮花仙者

蓮花仙者

发布时间:2026-01-10 21:36:10

|

353人浏览过

|

来源于php中文网

原创

php array_unique性能下降时,可采用五种高效去重方案:一、array_flip组合;二、预分配键名foreach;三、splfixedarray哈希映射;四、redis set外部去重;五、opcache+jit优化。

php高性能计算函数array_unique去重慢_去重高效实现技巧【技巧】

如果您在处理大规模数组时发现 PHP 内置函数 array_unique 执行耗时明显增长,则可能是由于其底层采用哈希表+遍历比对机制,在元素数量超过数万时性能急剧下降。以下是几种可替代的高效去重实现方式:

一、使用 array_flip + array_flip 组合去重

该方法利用 PHP 数组键名唯一性特性,通过两次翻转实现去重,避免内部逐值比较,时间复杂度接近 O(n),且不改变原始顺序(PHP 7.4+ 保证键序)。

1、将原数组作为值传入 array_flip,生成以原值为键、原键为值的新数组。

2、对上一步结果再次调用 array_flip,恢复值为原数组元素,自动剔除重复键名对应的重复值。

立即学习PHP免费学习笔记(深入)”;

3、使用 array_values 重置索引,确保返回索引数组而非关联数组。

二、预分配键名的 foreach 遍历去重

手动控制键名写入,跳过已存在键名的元素,避免函数调用开销与内存复制,适合需保留首次出现位置且数据类型统一的场景。

1、初始化一个空数组 $seen = [] 和结果数组 $result = []

2、遍历原始数组,对每个元素 $item 计算其字符串化标识(如 (string)$itemmd5(serialize($item)),视类型而定)。

3、检查该标识是否已存在于 $seen 中;若不存在,则将 $item 推入 $result,并将标识设为 $seen[$hash] = true

三、使用 SplFixedArray 配合哈希映射去重

适用于整数或短字符串为主的大规模数据,通过预分配固定大小的底层 C 数组减少内存管理开销,并结合线性探测哈希表加速存在性判断。

AI封面生成器
AI封面生成器

专业的AI封面生成工具,支持小红书、公众号、小说、红包、视频封面等多种类型,一键生成高质量封面图片。

下载

1、估算去重后最大可能长度,创建 SplFixedArray::fromArray([]) 并设置容量(如 new SplFixedArray(100000))。

2、定义哈希函数(如 $hash = $item % $capacity),对每个元素计算初始槽位。

3、若槽位为空,直接存入;若已被占用,执行线性探测寻找下一个空槽,同时维护独立的 bool[] 标记数组用于快速判重。

四、基于 Redis SET 结构的外部去重

当数组来自数据库查询或日志流,且允许引入外部服务时,可将去重逻辑卸载至 Redis,利用其原生命令 SADD 的幂等性完成去重,PHP 端仅负责批量写入与读取。

1、建立 Redis 连接,选择一个唯一键名(如 "dedupe:batch_".date('YmdHis'))作为临时集合名。

2、调用 $redis->sAdd($key, ...$array) 批量插入所有元素,Redis 自动过滤重复项。

3、执行 $redis->sMembers($key) 获取去重后结果,再调用 $redis->del($key) 清理临时键。

五、启用 OPcache 并配合 JIT 编译优化 array_unique 调用

针对无法重构代码但需提升现有 array_unique 性能的场景,可通过 PHP 运行时配置增强其执行效率,尤其在 PHP 8.0+ 启用 JIT 后效果显著。

1、确认 opcache.enable=1opcache.jit_buffer_size 设置为非零值(如 256M)。

2、设置 opcache.jit=1255 模式,启用函数调用内联与循环优化。

3、确保待处理数组已预先分配内存(如使用 array_fill(0, $size, null) 初始化),避免运行时频繁 realloc。

相关文章

数码产品性能查询
数码产品性能查询

该软件包括了市面上所有手机CPU,手机跑分情况,电脑CPU,电脑产品信息等等,方便需要大家查阅数码产品最新情况,了解产品特性,能够进行对比选择最具性价比的商品。

下载

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

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

335

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

223

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

970

2023.08.02

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

252

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

1049

2024.03.01

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

225

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

738

2023.08.03

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

23

2026.03.06

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 13.1万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 11.3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 1.0万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号