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

PHP 陣列去重後索引不連續問題的解決方案

     編輯:PHP 綜合知識

問題現象

使用 array_unique() 移除陣列重複值時,該函數保留原有鍵名,導致結果陣列索引不連續。若直接使用 for 迴圈配合 count() 遍歷,將遺漏元素。

錯誤示範

$test_array = array(1,2,3,4,4,5,5,6);
$test_array_unique = array_unique($test_array);
// 結果:Array ( [0]=>1 [1]=>2 [2]=>3 [3]=>4 [5]=>5 [7]=>6 )
// 索引 4、6 被刪除元素佔用,實際元素只有 6 個,但最大索引為 7

for($i=0; $i<count($test_array_unique); $i++) {
    echo $test_array_unique[$i];
}
// 輸出:12345   (遺漏了索引 7 的值 6)

解決方案:使用 array_values() 重建索引

array_values() 返回陣列所有值並重新建立 0 起始的連續數字索引,完美解決遍歷問題。

正確寫法

$test_array = array(1,2,3,4,4,5,5,6);
$test_array_unique = array_values(array_unique($test_array));
// 結果:Array ( [0]=>1 [1]=>2 [2]=>3 [3]=>4 [4]=>5 [5]=>6 )

for($i=0; $i<count($test_array_unique); $i++) {
    echo $test_array_unique[$i];
}
// 輸出:123456  (完整輸出所有元素)

進階補充:關聯陣列去重

array_unique() 對關聯陣列同樣保留鍵名。若需重置為數字索引,同樣套用 array_values():

$assoc = array('a'=>1, 'b'=>2, 'c'=>1, 'd'=>3);
$unique = array_values(array_unique($assoc));
// 結果:Array ( [0]=>1 [1]=>2 [2]=>3 )

效能考量

  • array_unique() 時間複雜度 O(n log n),大型陣列(>10萬元素)可能較慢。
  • 若陣列已排序,可使用 array_flip(array_flip($arr)) 技巧(僅適用純值陣列),速度更快。
  • PHP 7.2+ 版本對 array_unique() 有顯著效能優化。

最佳實踐總結

  1. 去重:$unique = array_unique($arr);
  2. 重建索引:$result = array_values($unique);
  3. 合寫:$result = array_values(array_unique($arr));
  4. 遍歷:優先使用 foreach 避免索引問題,foreach($result as $val) 最安全簡潔。

記住:去重後必須重建索引才能安全使用數字索引遍歷,這是 PHP 陣列操作中極易踩坑的細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved