php 数组去重

来源:互联网 发布:多功能助手软件下载 编辑:程序博客网 时间:2024/05/01 12:27

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

0 0
原创粉丝点击