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 数组减少内存管理开销,并结合线性探测哈希表加速存在性判断。

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

ARTi.PiCS
ARTi.PiCS

ARTi.PiCS是一款由AI驱动的虚拟头像生产器,可以生成200多个不同风格的酷炫虚拟头像

下载

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。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2401

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1547

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1444

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

951

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1414

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1233

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1445

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1305

2023.11.13

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

80

2026.01.09

热门下载

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

精品课程

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

共137课时 | 8.5万人学习

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

共6课时 | 6.9万人学习

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

共13课时 | 0.8万人学习

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

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