PHP一维数组去重函数array_unique()去重效率测试
- 2018-09-26 15:02:00
- 小熊 原创
- 14310
一、array_unique的定义
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
array_unique — 移除数组中重复的值
说明
array array_unique ( array $array [, int $sort_flags = SORT_STRING ] )
array_unique()接受array作为输入并返回没有重复值的新数组。
注意:
键名保留不变,array_unique()先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的array中同一个值的第一个出现的键名会被保留。
当且仅当 (string) $elem1 === (string) $elem2 时两个单元被认为相同。 例如,字符串表达一样时,会使用首个元素。
参数
array
输入的数组。
sort_flags
第二个可选参数sort_flags 可用于修改排序行为:
排序类型标记:
SORT_REGULAR - 按照通常方法比较(不修改类型)。
SORT_NUMERIC - 按照数字形式比较。
SORT_STRING - 按照字符串形式比较。
SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。
返回值
返回过滤后的数组。
举例
<?php $input = array("a" => "green", "red", "b" => "green", "blue", "red"); $result = array_unique($input); print_r($result); ?>
输出为:
Array
(
[a] => green
[0] => red
[1] => blue
)
二、array_unique方法去重效率测试
创建100000个随机元素的数组。
for($i=0; $i<100000; $i++) { $arr[] = mt_rand(1,99); }
2.记录开始去重时间。
$starttime = getMicrotime();
3.去重。
$arr = array_unique($arr);
4.记录结束时间。
$endtime = getMicrotime();
5.PHP占用内存函数。
/** * 获取使用内存 * @return float * @author itbear * @link www.beatmoon.com */ function getUseMemory() { $use_memory = round(memory_get_usage(true)/1024,2).'kb'; return $use_memory; }
6.获取microtime时间。
/** * 获取microtime * @return float * @author itbear * @link www.beatmoon.com */ function getMicrotime() { list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec; }
7.输出测试结果。
echo 'unique count:'.count($arr).'<br>'; echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>'; echo 'use memory:'.getUseMemory();
8.完整程序展示。
for($i=0; $i<100000; $i++) { $arr[] = mt_rand(1,99); } $starttime = getMicrotime(); $arr = array_unique($arr); $endtime = getMicrotime(); echo 'unique count:'.count($arr).'<br>'; echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>'; echo 'use memory:'.getUseMemory(); /** * 获取使用内存 * @return float * @author itbear * @link www.beatmoon.com */ function getUseMemory() { $use_memory = round(memory_get_usage(true)/1024,2).'kb'; return $use_memory; } /** * 获取microtime * @return float * @author itbear * @link www.beatmoon.com */ function getMicrotime() { list($usec, $sec) = explode(' ', microtime()); return (float)$usec + (float)$sec; }
9.结果展示。
unique count:99
run time:4.2839050292969ms
use memory:2048kb
10.结果截图
11.测试100次,计算平均值
略(可使用程序循环100次计算得出。)
总结:
基于该函数功能实现原理,先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。该函数性能确实不容乐观。
自定义写一个函数,来解决PHP一维数组去重问题,其性能见《 PHP自定义函数数组去重性能测试》。
联系人: | 小熊 |
---|---|
电话: | 18037578880 |
Email: | admin@cnsite.org |
QQ: | 929410000 |
微信: | itseor |
微博: | itseoer |
网址: | www.beatmoon.com |