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 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
PHP二维数组的去重问题解析
Jul 17 PHP
Could not load type System.ServiceModel.Activation.HttpModule解决办法
Dec 29 PHP
PHP跳转页面的几种实现方法详解
Jun 08 PHP
深入array multisort排序原理的详解
Jun 18 PHP
如何修改和添加Apache的默认站点目录
Jul 05 PHP
php inc文件使用的风险和注意事项
Nov 12 PHP
PHP 接入支付宝即时到账功能
Sep 18 PHP
Thinkphp事务操作实例(推荐)
Apr 01 PHP
ThinkPHP框架实现数据增删改
May 07 PHP
PHP文字转图片功能原理与实现方法分析
Aug 31 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 论坛采集程序 模拟登陆,抓取页面 实现代码
2009/07/09 PHP
ThinkPHP视图查询详解
2014/06/30 PHP
laravel 执行迁移回滚示例
2019/10/23 PHP
如何制作浮动广告 JavaScript制作浮动广告代码
2012/12/30 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
jquery自定义右键菜单、全选、不连续选择
2016/03/01 Javascript
微信小程序下拉刷新界面的实现
2017/09/28 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
2018/02/01 Javascript
vue2.0 axios跨域并渲染的问题解决方法
2018/03/08 Javascript
基于JS实现带动画效果的流程进度条
2018/06/01 Javascript
JavaScript数据结构之栈实例用法
2019/01/18 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
详解JavaScript的变量
2019/04/04 Javascript
vue使用better-scroll实现滑动以及左右联动
2020/06/30 Javascript
js正则表达式简单校验方法
2021/01/03 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Python 编程速成(推荐)
2019/04/15 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
python字符串格式化方式解析
2019/10/19 Python
python剪切视频与合并视频的实现
2020/03/03 Python
selenium如何定位span元素的实现
2021/01/13 Python
用CSS3来实现社交分享按钮
2014/11/11 HTML / CSS
HTML5实现的图片无限加载的瀑布流效果另带边框圆角阴影
2014/03/07 HTML / CSS
期末总结的个人自我评价
2013/11/02 职场文书
会计系中文个人求职信
2013/12/24 职场文书
中式结婚主持词
2014/03/14 职场文书
小学班主任评语大全
2014/04/23 职场文书
2014年采购工作总结
2014/11/20 职场文书
碧霞祠导游词
2015/02/09 职场文书
商标侵权律师函
2015/05/27 职场文书
2016年“世界环境日”校园广播稿
2015/12/18 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL