PHP的数组中提高元素查找与元素去重的效率的技巧解析
提高查找数组元素的效率
1.php in_array方法说明
php查找数组元素是否存在,一般会使用in_array方法。
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
参数说明:
needle,待搜索的值,如果needle是字符串,比较是区分大小写的。
haystack,用来比较的数组
strict,如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同
返回值,如果找到 needle 则返回 TRUE,否则返回 FALSE。
2.in_array查找元素效率
当比较的数组haystack较大时,in_array效率会很低
例子:使用in_array对有10万个元素的数组进行1000次比较
$arr = array();// 创建10万个元素的数组for($i=0; $i<100000; $i++){$arr[] = $i;}// 记录开始时间$starttime = getMicrotime();// 随机创建1000个数字使用in_array比较for($j=0; $j<1000; $j++){$str = mt_rand(1,99999);in_array($str, $arr);}// 记录结束时间$endtime = getMicrotime();echo ‘run time:’.(float)(($endtime-$starttime)*1000).‘ms<br>’;
run time: 672.09196090698ms
使用in_array判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约672毫秒
3.提高查找元素效率方法
我们可以先使用array_flip进行键值互换,然后使用isset方法来判断元素是否存在,这样可以提高效率。
例子:使用array_flip先进行键值互换,再使用isset方法判断,在10万个元素的数组中比较1000次
$arr = array();// 创建10万个元素的数组for($i=0; $i<100000; $i++){$arr[] = $i;}// 键值互换$arr = array_flip($arr);// 记录开始时间$starttime = getMicrotime();// 随机创建1000个数字使用isset比较for($j=0; $j<1000; $j++){$str = mt_rand(1,99999);isset($arr[$str]);}// 记录结束时间$endtime = getMicrotime();echo ‘run time:’.(float)(($endtime-$starttime)*1000).‘ms<br>’;
run time:2.5088787078857ms
使用array_flip与isset判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约2.5毫秒,因此,对于大数组进行比较,使用array_flip与isset方法会比in_array效率高很多。
快速去重
1.使用array_unique方法进行去重对数组元素进行去重,我们一般会使用array_unique方法,使用这个方法可以把数组中的元素去重。
$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把键值重新排序。
2.使用array_unique方法去重效率
$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();
unique count:99 run time:416.05114936829ms use memory:11008kb
使用array_unique方法去重,运行时间需要约416 ms,内存占用约10m
3.更快的数组去重方法
php有一个键值互换的方法array_flip,我们可以使用这个方法去重,因为键值互换,原来重复的值会变为相同的键。
然后再进行一次键值互换,把键和值换回来则可以完成去重。
$arr = array();
// 创建100000个随机元素的数组for($i=0; $i<100000; $i++){$arr[] = mt_rand(1,99);}// 记录开始时间$starttime = getMicrotime();// 使用键值互换去重$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();
unique count:99 run time:11.286973953247m suse memory:3072kb
使用array_flip方法去重,运行时间需要约11ms,内存占用约3m,因此使用array_flip方法去重比使用array_unique方法运行时间减少98%,内存占用减少70%;