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

PHP 找出陣列重複元素與去除重複值完整教學

     編輯:PHP 相關知識

陣列去重與找出重複值是資料清洗常見需求。PHP 提供 array_unique、array_count_values、array_diff_key 等內建函數,組合使用可輕鬆完成。本文提供兩種找出重複值的方法、去重技巧與刪除指定值實例。

一、找出重複元素

方法一:array_count_values 統計次數

<?php
function array_repeat($arr) {
    if (!is_array($arr)) return $arr;

    $counts = array_count_values($arr); // 值 => 出現次數
    $duplicates = array();
    foreach ($counts as $val => $cnt) {
        if ($cnt > 1) $duplicates[] = $val;
    }
    return $duplicates;
}

$arr = array('apple','blue','red','banana','pear','apple','blue','color','color');
print_r(array_repeat($arr));
/* 輸出:
Array ( [0] => apple [1] => blue [2] => color )
*/

方法二:array_unique + array_diff_key 比對索引

<?php
function array_repeat_v2($arr) {
    if (!is_array($arr)) return $arr;

    $unique = array_unique($arr);           // 保留第一次出現的鍵值
    $diff = array_diff_key($arr, $unique);  // 找出被移除的鍵(即重複項)
    return array_unique($diff);             // 只保留值,去除重複索引
}

原理: array_unique 保留首次出現的鍵,array_diff_key 比較鍵名差異,取得後續重複項的鍵,最後再 array_unique 取唯一值。

二、去除重複元素(保留首次出現)

<?php
$arr = array('a', 'b', 'a', 'c', 'b');
$unique = array_unique($arr); // ['a', 'b', 'c'],鍵保持 0,1,3

// 若需重置數字索引
$reindexed = array_values($unique); // ['a', 'b', 'c'] 鍵 0,1,2
?>

三、刪除陣列中指定值的所有項目

<?php
$array1 = array(
    1 => "www.example.com",
    2 => "鳳梨",
    4 => "www.example.com",
    3 => "香蕉",
    5 => "芭樂",
    6 => "www.example.com"
);

$search_keys = array_keys($array1, "www.example.com");
foreach ($search_keys as $key) {
    unset($array1[$key]);
}
print_r($array1);
/* 結果:
Array ( [2] => 鳳梨 [3] => 香蕉 [5] => 芭樂 )
*/

四、刪除單一索引元素:unset vs array_splice

<?php
$b = array("red", "green", "blue", "yellow");
unset($b[1]);          // 刪除索引 1,陣列變 [0=>red, 2=>blue, 3=>yellow],索引不連續
// $b[1] 變成不存在,直接存取會發生 Notice

// 若需維持索引連續,使用 array_splice
$c = array("red", "green", "blue", "yellow");
array_splice($c, 1, 1); // 刪除索引 1,長度 1,結果 [0=>red, 1=>blue, 2=>yellow]
?>

五、手寫刪除函數(教學用,實務請用內建函數)

<?php
function delmember(&$array, $id) {
    $size = count($array);
    for ($i = 0; $i < $size - $id - 1; $i++) {
        $array[$id + $i] = $array[$id + $i + 1];
    }
    unset($array[$size - 1]);
}
// 此函數僅適用數字索引連續陣列,關聯陣列會破壞鍵名
?>

六、效能與選擇建議

需求推薦做法時間複雜度
去重並保留首次出現順序array_uniqueO(n)
找出所有重複值(不重複列出)array_count_values + 迴圈O(n)
刪除所有指定值array_keys + unset 迴圈O(n)
大量資料(>10萬)高頻操作考慮資料庫 DISTINCT / GROUP BY-

七、常見錯誤提醒

  • array_unique 預設使用 SORT_STRING 比較,數字 1 與字串 "1" 視為相同;若需嚴格型別比較,傳入 SORT_REGULAR 旗標(PHP 5.2.10+)。
  • 多維陣列無法直接用 array_unique,需先序列化或自訂遞迴比較。
  • unset 不會重建索引,後續 foreach 正常,但 for 迴圈或 array_push 可能產生非預期行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved