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

PHP 高效移除陣列重複值:array_unique() 完整指南

     編輯:PHP 相關知識

基本用法

<?php
$a = ["a" => "Cat", "b" => "Dog", "c" => "Cat"];
$result = array_unique($a);
print_r($result);
/*
Array
(
    [a] => Cat
    [b] => Dog
)
*/
?>
  • 保留**第一次出現**的鍵值對,後續重複值被移除。
  • **鍵名保持不變** (不重新索引)。
  • 預設使用「鬆散比較」 (Loose comparison, ==):"1" == 1 視為重複。

排序旗標 (PHP 5.2.10+)

<?php
$arr = [2, "2", 3, "3", 1];

// SORT_REGULAR (預設):一般比較,不轉型
print_r(array_unique($arr, SORT_REGULAR)); // [2, 3, 1] ("2" 與 2 不同)

// SORT_NUMERIC:數值比較
print_r(array_unique($arr, SORT_NUMERIC)); // [2, 3, 1] ("2" == 2)

// SORT_STRING:字串比較
print_r(array_unique($arr, SORT_STRING));  // [2, "2", 3, "3", 1] (全不同)

// SORT_LOCALE_STRING:依當地語系字串比較
// print_r(array_unique($arr, SORT_LOCALE_STRING));
?>

重新索引 (取得連續數字鍵)

<?php
$a = ["a" => "Cat", "b" => "Dog", "c" => "Cat"];
$result = array_values(array_unique($a)); // array_values() 重新索引
print_r($result);
/*
Array
(
    [0] => Cat
    [1] => Dog
)
*/
?>

多維陣列去重 (array_unique 不支援)

array_unique() 只能處理一維陣列。多維陣列需自行實作:

<?php
function arrayUniqueMulti($arr) {
    // 序列化每個子陣列當作唯一鍵
    $serialized = array_map('serialize', $arr);
    $unique = array_unique($serialized);
    return array_map('unserialize', $unique);
}

$data = [
    ['id' => 1, 'name' => 'A'],
    ['id' => 2, 'name' => 'B'],
    ['id' => 1, 'name' => 'A'], // 重複
];
print_r(arrayUniqueMulti($data));
/*
Array
(
    [0] => Array ( [id] => 1 [name] => A )
    [1] => Array ( [id] => 2 [name] => B )
)
*/
?>

大陣列效能優化

  • array_unique() 內部需排序比較,時間複雜度約 O(n log n),大陣列 (10萬+) 可能較慢。
  • **替代方案**:使用 array_flip() 兩次 (僅適用純量值陣列,且值需能作為鍵名):
    $unique = array_flip(array_flip($arr)); // 極快,但會丟失原鍵名、重新索引、且值必須為 int/string
  • 若頻繁去重,考慮資料庫層面 DISTINCT 或應用層快取。

嚴格比較需求 (===)

PHP 內建無嚴格模式旗標。需嚴格比較 (型別也要相同) 時:

<?php
function array_unique_strict($arr) {
    $seen = [];
    return array_filter($arr, function($v) use (&$seen) {
        $key = is_array($v) ? serialize($v) : (gettype($v) . ':' . $v);
        if (isset($seen[$key])) return false;
        $seen[$key] = true;
        return true;
    });
}

$arr = [1, "1", 2, "2", true, false];
print_r(array_unique_strict($arr));
// [1, "1", 2, "2", true, false] 全部保留 (型別不同)
?>

總結

需求方法
一維陣列基本去重array_unique($arr)
去重並重新索引array_values(array_unique($arr))
數值比較去重 (1 == "1")array_unique($arr, SORT_NUMERIC)
字串比較去重 ("1" !== "1")array_unique($arr, SORT_STRING)
多維陣列去重array_map('unserialize', array_unique(array_map('serialize', $arr)))
超大陣列純量值極速去重array_flip(array_flip($arr)) (副作用:重新索引、丟鍵名)
嚴格型別去重 (1 !== "1")自訂 array_filter + 序列化/型別標記
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved