PHP一维数组去重函数array_unique()去重效率测试

2018-09-26 15:02:00
小熊
原创
653
摘要:在程序开发中,函数去重使用非常普遍。PHP系统去重函数array_unique()使用非常简单方便。但是他的去重效率如何呢?

一、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作为输入并返回没有重复值的新数组。

注意:

  1. 键名保留不变,array_unique()先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的array中同一个值的第一个出现的键名会被保留。

  2. 当且仅当 (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方法去重效率测试

  1. 创建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.结果截图


array_unique方法去重效率测试结果

11.测试100次,计算平均值

略(可使用程序循环100次计算得出。)

总结:

  1. 基于该函数功能实现原理,先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。该函数性能确实不容乐观。

  2. 自定义写一个函数,来解决PHP一维数组去重问题,其性能见《 PHP自定义函数数组去重性能测试》。

发表评论
评论通过审核后显示。
文章分类
联系我们
联系人: 小熊
电话: 18037578880
Email: admin@cnsite.org
QQ: 929410000
微信: itseor
微博: itseoer