国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > 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;

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 锦屏县| 米易县| 广平县| 甘肃省| 沾益县| 潮安县| 壶关县| 四子王旗| 周口市| 枣庄市| 平顶山市| 新宁县| 高碑店市| 宁化县| 无锡市| 海口市| 普定县| 安乡县| 上犹县| 红桥区| 格尔木市| 罗田县| 苍南县| 恭城| 和林格尔县| 平定县| 天等县| 边坝县| 嘉善县| 新建县| 宜章县| 汕头市| 上林县| 宁陵县| 廉江市| 务川| 柳河县| 璧山县| 兴和县| 西丰县| 繁昌县|