最近一个项目的研究,在大量数据下,PHP如何快速的在数组中去除重复元素和快速查找需要的元素信息。采用多种不同方法进行对比,最终得出下列效率最高的方法。

快速去重

对数组元素进行去重,一般会使用 array_unique 方法。

unique count:99
run time:653.39303016663ms
use memory:5120kb

现在采用键值互换的方法 array_flip,可以使用这个方法进行键值互换,原来重复的值会变为相同的元素键,进行去重。最后再进行一次键值互换,把键和值换回来则可以完成去重。

<?php

$arr = array();

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

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

监控结果:

unique count:99
run time:12.840032577515ms
use memory:768kb

快速查找

查找数组元素是否存在,一般会使用 in_array 方法。

unique count:100000
run time:163.16294670105ms
use memory:6148kb

现在先使用 array_flip 进行键值互换,然后使用 isset 方法来判断元素是否存在。

<?php

$arr = array();

// 创建10万个元素的数组
for($i=0; $i<100000; $i++){
  $arr[] = $i;
}

// 键值互换
$arr = array_flip($arr);

// 随机创建1000个数字使用isset比较
for($j=0; $j<1000; $j++){
  $str = mt_rand(1,99999);
  isset($arr[$str]);
}

监控结果:

unique count:100000
run time:0.40984153747559ms
use memory:6148kb

记录实验数据相关代码

<?php

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

    ### 实验代码部分 ###

    // 记录
    $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;
    }

标签: none

添加新评论