php 数组去重

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() 函数把键值重新排序(即只取数组中的 value,key 重新生成 0,1,2,3……..)。

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

上面是原作者的结果,由于我的环境是 ubuntu + php7,因此结果不一样:

unique count:99
run time:266.930103302ms
use memory:2048kb

运行时间需要约 270ms,内存占用约 2m

3、更快的数组去重方法

PHP 有一个键值互换的方法 array_flip(),我们可以使用这个方法去重,因为键值互换,原来重复的值会变为相同的键,由于键值必须唯一,因此能够达到去重的目的。
然后再进行一次键值互换,把键和值换回来则可以完成去重。

<?php
    $arr = array();

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

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

    //$arr = array_unique($arr);

    // 使用键值互换去重
    $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方法去重,运行时间需要约13ms,内存占用约2m

上面是原作者的结果,由于我的环境是 ubuntu + php7,因此结果不一样:

unique count:99
run time:5.2969455718994ms
use memory:2048kb

运行时间需要约 5ms,内存占用约 2m

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

最后:

可以发现,使用了 array_flip() 函数,效率提高幅度很大。

除了上面的方法外,我们还可以使用 array_keys() 函数,就是将上面代码中的:

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

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

//重新生成键值
$arr = array_values($arr);

换成:

$arr = array_flip($arr);
$arr = array_keys($arr);

$endtime = getMicrotime();

即可。

array_keys(),取数组的所有 key 作为 value 重新组成数组。

运行结果:

unique count:99
run time:5.2149295806885ms
use memory:2048kb

与 array_flip() 基本不发生变化,当然,我没有看过这两个函数的源码,不能确切的说哪个方法更好。

总的来说,比 array_unique() 的性能好的不是一点点。

本博客参考(90%+)自http://blog.csdn.net/fdipzone/article/details/50573353

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值