php 数组元素快速去重


Posted in PHP onMay 05, 2017

1.使用array_unique方法进行去重

对数组元素进行去重,我们一般会使用array_unique方法,使用这个方法可以把数组中的元素去重。

<?php
$arr = array(1,1,2,3,3,3,4,4,5,6,6,7,8,8,9,9,9);
$arr = array_unique($arr);
$arr = array_values($arr);
print_r($arr);
?>

输出:

Array
(
  [0] => 1
  [1] => 2
  [2] => 3
  [3] => 4
  [4] => 5
  [5] => 6
  [6] => 7
  [7] => 8
  [8] => 9
)

去重后,键值会不按顺序,可以使用array_values把键值重新排序。

2.使用array_unique方法去重效率

<?php
$arr = array();

// 创建100000个随机元素的数组
for($i=0; $i<100000; $i++){
  $arr[] = mt_rand(1,99);
}

// 记录开始时间
$starttime = getMicrotime();

// 去重
$arr = array_unique($arr);

// 记录结束时间
$endtime = getMicrotime();

$arr = array_values($arr);

echo 'unique count:'.count($arr).'<br>';
echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
echo 'use memory:'.getUseMemory();

/**
 * 获取使用内存
 * @return float
 */
function getUseMemory(){
  $use_memory = round(memory_get_usage(true)/1024,2).'kb';
  return $use_memory;
}
/**
 * 获取microtime
 * @return float
 */
function getMicrotime(){
  list($usec, $sec) = explode(' ', microtime());
  return (float)$usec + (float)$sec;
}
?>

unique count:99
run time:653.39303016663ms
use memory:5120kb

使用array_unique方法去重,运行时间需要约650ms,内存占用约5m

3.更快的数组去重方法

PHP有一个键值互换的方法array_flip,我们可以使用这个方法去重,因为键值互换,原来重复的值会变为相同的键。

然后再进行一次键值互换,把键和值换回来则可以完成去重。

<?php
$arr = array();

// 创建100000个随机元素的数组
for($i=0; $i<100000; $i++){
  $arr[] = mt_rand(1,99);
}

// 记录开始时间
$starttime = getMicrotime();

// 使用键值互换去重
$arr = array_flip($arr);
$arr = array_flip($arr);

// 记录结束时间
$endtime = getMicrotime();

$arr = array_values($arr);

echo 'unique count:'.count($arr).'<br>';
echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
echo 'use memory:'.getUseMemory();

/**
 * 获取使用内存
 * @return float
 */
function getUseMemory(){
  $use_memory = round(memory_get_usage(true)/1024,2).'kb';
  return $use_memory;
}
/**
 * 获取microtime
 * @return float
 */
function getMicrotime(){
  list($usec, $sec) = explode(' ', microtime());
  return (float)$usec + (float)$sec;
}
?>

unique count:99
run time:12.840032577515ms
use memory:768kb

使用array_flip方法去重,运行时间需要约18ms,内存占用约2m

因此使用array_flip方法去重比使用array_unique方法运行时间减少98%,内存占用减少4/5;

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

PHP 相关文章推荐
一贴学会PHP 新手入门教程
Aug 03 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
PHP6 中可能会出现的新特性预览
Apr 04 PHP
php之Smarty模板使用方法示例详解
Jul 08 PHP
php魔术函数__call()用法实例分析
Feb 13 PHP
php实现的简单日志写入函数
Mar 31 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
PHP实现找出链表中环的入口节点
Jan 16 PHP
Laravel向公共模板赋值方法总结
Jun 25 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
Oct 22 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
Mar 09 PHP
Yii2实现自定义独立验证器的方法
May 05 #PHP
php 查找数组元素提高效率的方法详解
May 05 #PHP
thinkPHP分页功能实例详解
May 05 #PHP
php cli模式下获取参数的方法
May 05 #PHP
ajax调用返回php接口返回json数据的方法(必看篇)
May 05 #PHP
ThinkPHP 3.2.2实现事务操作的方法
May 05 #PHP
PHP实现Session入库/存入redis的方法
May 04 #PHP
You might like
php中大括号作用介绍
2012/03/22 PHP
PHP中fwrite与file_put_contents性能测试代码
2013/08/02 PHP
在html文件中也可以执行php语句的方法
2015/04/09 PHP
CodeIgniter配置之autoload.php自动加载用法分析
2016/01/20 PHP
jQuery ajax BUG:object doesn't support this property or method
2010/07/06 Javascript
写js时遇到的一些小问题
2010/12/06 Javascript
jquery中获取select选中值的代码
2011/06/27 Javascript
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
2013/06/28 Javascript
使用JS CSS去除IE链接虚线框的三种方法
2013/11/14 Javascript
动态创建script在IE中缓存js文件时导致编码的解决方法
2014/05/04 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
2016/05/24 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
AngularJS实现的base64编码与解码功能示例
2018/05/17 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
JavaScript数组排序功能简单实现
2020/05/14 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
python中的函数用法入门教程
2014/09/02 Python
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
Django 自定义分页器的实现代码
2019/11/24 Python
python ftplib模块使用代码实例
2019/12/31 Python
python模拟哔哩哔哩滑块登入验证的实现
2020/04/24 Python
谈谈python垃圾回收机制
2020/09/27 Python
python实现杨辉三角的几种方法代码实例
2021/03/02 Python
alice McCALL官网:澳大利亚时尚品牌
2020/11/16 全球购物
触发器(trigger)的功能都有哪些?写出一个触发器的例子
2012/09/17 面试题
自我鉴定 电子商务专业
2014/01/30 职场文书
工地标语大全
2014/06/18 职场文书
技术入股合作协议书
2014/10/07 职场文书
工伤劳动仲裁代理词
2015/05/25 职场文书
毕业设计工作总结
2015/08/14 职场文书
详解Redis瘦身指南
2021/05/26 Redis
Python中np.random.randint()参数详解及用法实例
2022/09/23 Python