亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品国内视频| 日韩有码在线视频| 久久精品99久久香蕉国产色戒| 九九热99久久久国产盗摄| 精品亚洲一区二区三区| 亚洲国产天堂久久综合网| 欧美裸体xxxx极品少妇| 精品久久香蕉国产线看观看gif| 日韩av中文字幕在线免费观看| 国产美女精品视频免费观看| 91在线视频一区| 国产精品视频一| 色噜噜亚洲精品中文字幕| 久久精品国产99国产精品澳门| 国产色综合天天综合网| 国产精品白嫩美女在线观看| 欧美综合一区第一页| 日韩精品免费在线播放| 国产女人精品视频| 夜夜嗨av一区二区三区免费区| 亚洲国产婷婷香蕉久久久久久| 神马久久久久久| 欧美激情国内偷拍| 国产精品一区二区三区毛片淫片| 国产91精品网站| 久久国产精品久久久| 国产精品成人在线| 韩国欧美亚洲国产| 精品久久久久久久久久久久久| 国产亚洲aⅴaaaaaa毛片| 欧美性猛交xxxx乱大交| 另类美女黄大片| 亚洲综合第一页| 欧美多人乱p欧美4p久久| 欧美激情免费观看| 日韩成人黄色av| 国产精品久久久久久久久免费看| 久久久999成人| 一区二区在线免费视频| 国产丝袜一区视频在线观看| 欧美日韩一区二区免费视频| 国产精品久久久久久婷婷天堂| 欧美极品少妇xxxxⅹ免费视频| 欧美精品电影免费在线观看| 亚洲天堂av在线播放| 欧美色videos| 91精品中国老女人| 成人午夜黄色影院| 精品久久久久久中文字幕| 色偷偷偷综合中文字幕;dd| 亚洲欧美另类自拍| 91福利视频网| 中文字幕亚洲一区在线观看| 欧美猛少妇色xxxxx| 青青久久av北条麻妃黑人| 国产精品免费电影| 欧美激情精品久久久| 欧美午夜宅男影院在线观看| 欧美做受高潮电影o| 高清欧美电影在线| 久久亚洲精品中文字幕冲田杏梨| 人人澡人人澡人人看欧美| 国产精品福利在线观看| 亚洲欧美日本精品| 成人免费自拍视频| 欧美精品激情在线观看| 中文字幕亚洲欧美日韩高清| 青青在线视频一区二区三区| 精品国内自产拍在线观看| 成年无码av片在线| 成人精品久久一区二区三区| 久久人人97超碰精品888| 久久久久久久久久久久久久久久久久av| 色多多国产成人永久免费网站| 欧美大秀在线观看| 国产成人综合久久| 日韩精品999| 久热爱精品视频线路一| 九九精品在线观看| 国产91精品高潮白浆喷水| 国产成人在线播放| 亚洲第一页自拍| 国产精品爽爽爽| 亚洲在线免费观看| 久久久国产精品视频| 亚洲美女在线观看| 中文字幕久热精品在线视频| 亚洲国产精品va在线| 日韩av免费在线观看| 欧美成人黑人xx视频免费观看| 国产精品久久久久久av| 亚洲成人久久久| 91牛牛免费视频| 亚洲欧美成人在线| 日本精品一区二区三区在线播放视频| 久久777国产线看观看精品| 国内精品400部情侣激情| 精品国产一区av| 欧美日韩在线免费| 精品露脸国产偷人在视频| 亚洲高清久久网| 国产又爽又黄的激情精品视频| 97视频在线观看免费| 国产乱人伦真实精品视频| 亚洲精品美女久久久久| 欧美高清在线视频观看不卡| 欧美床上激情在线观看| 日本精品一区二区三区在线播放视频| 国产精品久久久久7777婷婷| 97视频免费看| 97色在线观看免费视频| 欧美有码在线视频| 久久久久久久97| 成人啪啪免费看| 日韩精品视频在线播放| 亚洲欧洲在线视频| 亚洲欧洲自拍偷拍| 欧美中文字幕在线| 色妞色视频一区二区三区四区| 亚洲一区二区三区香蕉| 欧美日韩性视频在线| 成人黄色av播放免费| 欧美裸体男粗大视频在线观看| 精品国产区一区二区三区在线观看| 欧美激情图片区| 日韩亚洲在线观看| 欧美综合激情网| 亚洲xxx大片| 成人在线精品视频| 国产精品白嫩美女在线观看| 国产精品色午夜在线观看| 5566成人精品视频免费| 久久人人爽人人| 97视频在线观看免费高清完整版在线观看| 欧美美女15p| 九九视频直播综合网| 日韩在线观看高清| 亚洲综合中文字幕68页| 日韩视频精品在线| 欧美国产日本高清在线| 亚洲大胆人体av| 欧美成人黄色小视频| 国产精品嫩草视频| 欧美精品18videos性欧美| 欧美日韩激情视频| 日本中文字幕成人| 亚洲欧美另类中文字幕| 欧美精品免费播放| 国产精品女主播| 91香蕉电影院| 成年人精品视频| 97精品久久久中文字幕免费| 欧美精品第一页在线播放| 国产+成+人+亚洲欧洲| 久久久久久久久久久久久久久久久久av| 色悠悠久久久久| 国产精品视频26uuu| 国产精品丝袜一区二区三区| 日韩精品日韩在线观看| 国产suv精品一区二区三区88区| 久久噜噜噜精品国产亚洲综合| 九九久久久久99精品| 欧美日韩中文在线| 在线观看精品国产视频|