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的explode和implode的使用说明
Jul 17 PHP
PHP+JS实现大规模数据提交的方法
Jul 02 PHP
PHP使用array_merge重新排列数组下标的方法
Jul 22 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP session 会话处理函数
Jun 06 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
Yii2.0表关联查询实例分析
Jul 18 PHP
php实现登陆模块功能示例
Oct 20 PHP
老生常谈PHP数组函数array_merge(必看篇)
May 25 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP实现获取ip地址的5种方法,以及插入用户登录日志操作示例
Feb 28 PHP
thinkPHP5框架路由常用知识点汇总
Sep 15 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
PHP调用三种数据库的方法(1)
2006/10/09 PHP
PHP中函数rand和mt_rand的区别比较
2012/12/26 PHP
php获取apk包信息的方法
2014/08/15 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
Laravel框架Request、Response及Session操作示例
2019/05/06 PHP
js apply/call/caller/callee/bind使用方法与区别分析
2009/10/28 Javascript
jquery 仿QQ校友的DIV模拟窗口效果源码
2010/03/24 Javascript
JavaScript 小型打飞机游戏实现原理说明
2010/10/28 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
jquery延迟加载外部js实现代码
2013/01/11 Javascript
转义字符(\)对JavaScript中JSON.parse的影响概述
2013/07/17 Javascript
jquery实现图片渐变切换兼容ie6/Chrome/Firefox
2013/08/02 Javascript
JavaScript encodeURI 和encodeURIComponent
2015/12/04 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
Three.js学习之正交投影照相机
2016/08/01 Javascript
微信小程序 下拉列表的实现实例代码
2017/03/08 Javascript
Angular4学习笔记之新建项目的方法
2017/07/18 Javascript
vue addRoutes实现动态权限路由菜单的示例
2018/05/15 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
详解Nodejs get获取远程服务器接口数据
2019/03/26 NodeJs
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
Python标准库内置函数complex介绍
2014/11/25 Python
Python多线程编程(五):死锁的形成
2015/04/05 Python
解决python中的幂函数、指数函数问题
2019/11/25 Python
python爬虫添加请求头代码实例
2019/12/28 Python
Django实现内容缓存实例方法
2020/06/30 Python
html5教程制作简单画板代码分享
2013/12/04 HTML / CSS
通信工程毕业生自荐信
2013/11/01 职场文书
财务管理个人自荐书范文
2013/11/24 职场文书
公司授权委托书范文
2014/08/02 职场文书
法人代表证明书格式
2014/10/01 职场文书
年底个人总结范文
2015/03/10 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
2015年六一儿童节活动方案
2015/05/05 职场文书
红领巾广播站广播稿
2015/08/19 职场文书