首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 數組性能優化:元素查找與去重效率提升實測對比

     編輯:PHP 相關知識

場景痛點

大數組(10萬+ 元素)頻繁查找、去重時,in_array() 和 array_unique() 性能嚴重不足。本文通過實測對比,揭示高效替代方案。

一、元素查找:in_array vs isset + array_flip

1. in_array 基準測試

<?php
$arr = range(0, 99999);  // 10萬元素

$start = microtime(true);
for ($j = 0; $j < 1000; $j++) {
    $str = mt_rand(1, 99999);
    in_array($str, $arr);
}
$end = microtime(true);
echo 'in_array time: ' . ($end - $start) * 1000 . ' ms';
// 結果:約 2003 ms

2. array_flip + isset 優化方案

<?php
$arr = range(0, 99999);
$arr = array_flip($arr);  // 鍵值互換,值變鍵

$start = microtime(true);
for ($j = 0; $j < 1000; $j++) {
    $str = mt_rand(1, 99999);
    isset($arr[$str]);    // O(1) 哈希查找
}
$end = microtime(true);
echo 'isset time: ' . ($end - $start) * 1000 . ' ms';
// 結果:約 1.28 ms

3. 性能對比結論

方法10萬元素/1000次查找時間複雜度提升倍數
in_array()~2000 msO(n)基準
array_flip + isset()~1.3 msO(1)1500x+

原理:PHP 數組底層是有序哈希表,鍵查找為 O(1);in_array 需遍歷值,O(n)。array_flip 將值轉為鍵,利用哈希特性。

二、數組去重:array_unique vs 雙重 array_flip

1. array_unique 基準測試

<?php
$arr = [];
for ($i = 0; $i < 100000; $i++) $arr[] = mt_rand(1, 99);

$start = microtime(true);
$arr = array_unique($arr);
$arr = array_values($arr);  // 重排鍵
$end = microtime(true);
echo 'array_unique: ' . ($end - $start) * 1000 . ' ms, 內存: ' . round(memory_get_usage(true)/1024, 2) . ' KB';
// 結果:~653 ms, 5120 KB

2. 雙重 array_flip 去重

<?php
$arr = [];
for ($i = 0; $i < 100000; $i++) $arr[] = mt_rand(1, 99);

$start = microtime(true);
$arr = array_flip($arr);  // 值→鍵,重複值自動覆蓋
$arr = array_flip($arr);  // 鍵→值,恢復原結構
$arr = array_values($arr);
$end = microtime(true);
echo 'double flip: ' . ($end - $start) * 1000 . ' ms, 內存: ' . round(memory_get_usage(true)/1024, 2) . ' KB';
// 結果:~13 ms, 768 KB

3. 去重性能對比

方法耗時內存時間降低內存降低
array_unique()653 ms5120 KB基準基準
array_flip x213 ms768 KB98%85%

三、最佳實踐建議

  1. 頻繁查找大數組:預先 array_flip,用 isset() 或 array_key_exists()
  2. 大數組去重:優先 array_flip() 雙重翻轉
  3. 保持鍵名:去重後用 array_values() 重建索引
  4. 注意:array_flip 要求值為字符串或整數,且值唯一性由最後出現者決定

四、擴展:其他查找函數對比

  • array_search():返回鍵名,同樣 O(n)
  • array_key_exists():檢查鍵存在,O(1),但比 isset() 慢(需檢查 null 值)
  • isset():最快,但對 null 值返回 false
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved