PHP数组去重比较快的实现方式


Posted in PHP onJanuary 19, 2016

概述

使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组。这个函数大多数情况下都能工作得很好。但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些。

有一个比较好而且更快的函数array_flip()来替代使用array_unique()函数来创建唯一的数组。这个魔法般的函数会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,你会得到跟array_unique()函数一样的结果。

更快的方式实现PHP数组去重

/* 创建一个包含重复值的,一共四个元素的数组 */
$array = array('green','blue','orange','blue');
/* 翻转数组,你将会得到唯一键值的数组
array('green'=>0,'blue'=>1,'orange'=>2); */
$array = array_flip($array);
/* 然后再翻转一次,将键和值重新放置,然后得到数组:array(0=>'green',1=>'blue',2=>'orange'); */
$array = array_flip($array);

因为我们已经移除了一些元素,因此数组看起来不是正常的序列。比如我们可能会得到:array(0=>'A',2=>'B',5=>'C');。在某些情况下,这不是一个问题,但是如果你需要数组的键值保持数字的序列,你可以使用一到两种方法解决键值乱序的问题。

使用array_merge修复数组的keys

添加array_flip之后的函数,将会对数组的键值排序并且让它们恢复到正常的序列,如:0,1,2,3…

$array = array('green','blue','orange','blue');
$array = array_flip($array);
$array = array_flip($array);
/* 使用array_merge()函数修复键值*/
$array = array_merge($array); 
 

第二种方式,使用array_keys

注意,这种修复数组键值的方法比使用array_merge()函数稍微快了一点。你也可以在最后一步结合使用array_keys()函数(此函数返回翻转后的值)。然后当你翻转数组的值,键值就会根据顺序创建。

$array = array('green','blue','orange','blue');
$array = array_flip($array);
/* 跟第一个例子一样,但是现在我们先提取数组的键值 */
$array = array_keys($array);

结论

非常简单,比起在大数组使用array_unique函数,有了一个有效的性能提升。

PHP 相关文章推荐
使用PHP的日期与时间函数技巧
Apr 24 PHP
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
Jan 12 PHP
如何取得中文字符串中出现次数最多的子串
Aug 08 PHP
php数据类型判断函数有哪些
Sep 23 PHP
php获取指定日期之间的各个周和月的起止时间
Nov 24 PHP
php中switch语句用法详解
Aug 17 PHP
yii2中添加验证码的实现方法
Jan 09 PHP
laravel5创建service provider和facade的方法详解
Jul 26 PHP
PC端微信扫码支付成功之后自动跳转php版代码
Jul 07 PHP
Yii框架学习笔记之session与cookie简单操作示例
Apr 30 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
May 06 PHP
如何用PHP websocket实现网页实时聊天
May 26 PHP
PHP保存session到memcache服务器的方法
Jan 19 #PHP
PHP mysql事务问题实例分析
Jan 18 #PHP
给PHP开发者的编程指南 第一部分降低复杂程度
Jan 18 #PHP
PHP基于cookie与session统计网站访问量并输出显示的方法
Jan 15 #PHP
php实现的操作excel类详解
Jan 15 #PHP
php实现的xml操作类
Jan 15 #PHP
PHP基于单例模式实现的数据库操作基类
Jan 15 #PHP
You might like
自己做矿石收音机
2021/03/02 无线电
PHP 柱状图实现代码
2009/12/04 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
Yii框架中 find findAll 查找出制定的字段的方法对比
2014/09/10 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP实现防盗链的方法分析
2017/07/25 PHP
javascript Array.remove() 数组删除
2009/08/06 Javascript
基于jquery的tab切换 js原理
2010/04/01 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
JavaScript中判断对象类型的几种方法总结
2013/11/11 Javascript
footer定位页面底部(代码分享)
2017/03/07 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
jQuery实现基本隐藏与显示效果的方法详解
2018/09/05 jQuery
对angularjs框架下controller间的传值方法详解
2018/10/08 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
深入浅出 Vue 系列 -- 数据劫持实现原理
2019/04/23 Javascript
3分钟读懂移动端rem使用方法(推荐)
2019/05/06 Javascript
[42:32]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python中字典(Dictionary)用法实例详解
2015/05/30 Python
Python实现带百分比的进度条
2016/06/28 Python
浅谈python迭代器
2017/11/08 Python
将python代码和注释分离的方法
2018/04/21 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
Python数据类型之String字符串实例详解
2019/05/08 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
Window10下python3.7 安装与卸载教程图解
2019/09/30 Python
纯CSS3大转盘抽奖示例代码(响应式、可配置)
2017/01/13 HTML / CSS
印度首选时尚目的地:Reliance Trends
2018/01/17 全球购物
建筑施工员岗位职责
2013/11/26 职场文书
电子商务专业推荐信范文
2013/12/02 职场文书
2014年工程工作总结
2014/11/25 职场文书
2014年小学校长工作总结
2014/12/08 职场文书
离婚案件原告代理词
2015/05/23 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL