首页 > 语言 > PHP > 正文

PHP的数组中提高元素查找与元素去重的效率的技巧解析

2024-09-04 11:46:45
字体:
来源:转载
供稿:网友

提高查找数组元素的效率

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次比较

  1. <?php 
  2.  
  3. $arr = array(); 
  4.  
  5. // 创建10万个元素的数组 
  6.  
  7. for($i=0; $i<100000; $i++){ 
  8.  
  9.   $arr[] = $i
  10.  
  11.  
  12. // 记录开始时间 
  13.  
  14. $starttime = getMicrotime(); 
  15.  
  16. // 随机创建1000个数字使用in_array比较 
  17.  
  18. for($j=0; $j<1000; $j++){ 
  19.  
  20.   $str = mt_rand(1,99999); 
  21.  
  22.   in_array($str$arr); 
  23.  
  24.  
  25. // 记录结束时间 
  26.  
  27. $endtime = getMicrotime(); 
  28.  
  29. echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>'
  30.  
  31. /** 
  32.  
  33.  * 获取microtime 
  34.  
  35.  * @return float 
  36.  
  37.  */ 
  38.  
  39. function getMicrotime(){ 
  40.  
  41.   list($usec$sec) = explode(' ', microtime()); 
  42. //Vevb.com 
  43.   return (float)$usec + (float)$sec
  44.  
  45.  
  46. ?> 

run time:2003.6449432373ms

使用in_array判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约2秒

3.提高查找元素效率方法

我们可以先使用array_flip进行键值互换,然后使用isset方法来判断元素是否存在,这样可以提高效率。

例子:使用array_flip先进行键值互换,再使用isset方法判断,在10万个元素的数组中比较1000次

  1. <?php 
  2.  
  3. $arr = array(); 
  4.  
  5. // 创建10万个元素的数组 
  6.  
  7. for($i=0; $i<100000; $i++){ 
  8.  
  9.   $arr[] = $i
  10.  
  11.  
  12.  
  13. // 键值互换 
  14.  
  15. $arr = array_flip($arr);  
  16.  
  17. // 记录开始时间 
  18.  
  19. $starttime = getMicrotime(); 
  20.   
  21. // 随机创建1000个数字使用isset比较 
  22.  
  23. for($j=0; $j<1000; $j++){ 
  24.  
  25.   $str = mt_rand(1,99999); 
  26.  
  27.   isset($arr[$str]); 
  28.  
  29.   
  30. // 记录结束时间 
  31.  
  32. $endtime = getMicrotime(); 
  33.   
  34. echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>' 
  35.  
  36. /** 
  37.  
  38.  * 获取microtime 
  39.  
  40.  * @return float 
  41.  
  42.  */ 
  43.  
  44. function getMicrotime(){ 
  45.  
  46.   list($usec$sec) = explode(' ', microtime()); 
  47.  
  48.   return (float)$usec + (float)$sec
  49.  
  50.  
  51. ?> 

run time:1.2781620025635ms

使用array_flip与isset判断元素是否存在,在10万个元素的数组中比较1000次,运行时间需要约1.2毫秒

因此,对于大数组进行比较,使用array_flip与isset方法会比in_array效率高很多。

快速去重

1.使用array_unique方法进行去重

对数组元素进行去重,我们一般会使用array_unique方法,使用这个方法可以把数组中的元素去重。

  1. <?php 
  2.  
  3. $arr = array(1,1,2,3,3,3,4,4,5,6,6,7,8,8,9,9,9); 
  4.  
  5. $arr = array_unique($arr); 
  6.  
  7. $arr = array_values($arr); 
  8.  
  9. print_r($arr); 
  10.  
  11. ?> 

输出:

  1. Array 
  2.  
  3.  
  4.   [0] => 1 
  5.  
  6.   [1] => 2 
  7.  
  8.   [2] => 3 
  9.  
  10.   [3] => 4 
  11.  
  12.   [4] => 5 
  13.  
  14.   [5] => 6 
  15.  
  16.   [6] => 7 
  17.  
  18.   [7] => 8 
  19.  
  20.   [8] => 9 
  21.  

去重后,键值会不按顺序,可以使用array_values把键值重新排序。

2.使用array_unique方法去重效率

  1. <?php 
  2.  
  3. $arr = array(); 
  4.   
  5. // 创建100000个随机元素的数组 
  6.  
  7. for($i=0; $i<100000; $i++){ 
  8.  
  9.   $arr[] = mt_rand(1,99); 
  10.  
  11. } 
  12.  
  13. // 记录开始时间 
  14.  
  15. $starttime = getMicrotime();  
  16.  
  17. // 去重 
  18.  
  19. $arr = array_unique($arr); 
  20.   
  21. // 记录结束时间 
  22.  
  23. $endtime = getMicrotime(); 
  24.  
  25. $arr = array_values($arr); 
  26.   
  27. echo 'unique count:'.count($arr).'<br>'
  28.  
  29. echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>'
  30.  
  31. echo 'use memory:'.getUseMemory();  
  32.  
  33. /** 
  34.  
  35.  * 获取使用内存 
  36.  
  37.  * @return float 
  38.  
  39.  */ 
  40.  
  41. function getUseMemory(){ 
  42.  
  43.   $use_memory = round(memory_get_usage(true)/1024,2).'kb'
  44.  
  45.   return $use_memory
  46.  
  47.   
  48. /** 
  49.  
  50.  * 获取microtime 
  51.  
  52.  * @return float 
  53.  
  54.  */ 
  55.  
  56. function getMicrotime(){ 
  57.  
  58.   list($usec$sec) = explode(' ', microtime()); 
  59.  
  60.   return (float)$usec + (float)$sec
  61.  
  62.  
  63. ?> 
  1. unique count:99  
  2.  
  3. run time:653.39303016663ms  
  4.  
  5. use memory:5120kb 

使用array_unique方法去重,运行时间需要约650ms,内存占用约5m

3.更快的数组去重方法

php有一个键值互换的方法array_flip,我们可以使用这个方法去重,因为键值互换,原来重复的值会变为相同的键。

然后再进行一次键值互换,把键和值换回来则可以完成去重。

  1. <?php 
  2.  
  3. $arr = array(); 
  4.  
  5. // 创建100000个随机元素的数组 
  6.  
  7. for($i=0; $i<100000; $i++){ 
  8.  
  9.   $arr[] = mt_rand(1,99); 
  10.  
  11.  
  12.  
  13. // 记录开始时间 
  14.  
  15. $starttime = getMicrotime(); 
  16.   
  17. // 使用键值互换去重 
  18.  
  19. $arr = array_flip($arr); 
  20.  
  21. $arr = array_flip($arr);  
  22.  
  23. // 记录结束时间 
  24.  
  25. $endtime = getMicrotime();  
  26.  
  27. $arr = array_values($arr); 
  28.   
  29. echo 'unique count:'.count($arr).'<br>'
  30.  
  31. echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>'
  32.  
  33. echo 'use memory:'.getUseMemory();  
  34.  
  35. /** 
  36.  
  37.  * 获取使用内存 
  38.  
  39.  * @return float 
  40.  
  41.  */ 
  42.  
  43. function getUseMemory(){ 
  44.  
  45.   $use_memory = round(memory_get_usage(true)/1024,2).'kb'
  46.  
  47.   return $use_memory
  48.  
  49.  
  50.  
  51. /** 
  52.  
  53.  * 获取microtime 
  54.  
  55.  * @return float 
  56.  
  57.  */ 
  58.  
  59. function getMicrotime(){ 
  60.  
  61.   list($usec$sec) = explode(' ', microtime()); 
  62.  
  63.   return (float)$usec + (float)$sec
  64.  
  65.  
  66. ?> 
  1. unique count:99  
  2.  
  3. run time:12.840032577515ms  
  4.  
  5. use memory:768kb 

使用array_flip方法去重,运行时间需要约18ms,内存占用约2m

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

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表