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

PHP 陣列去重技巧:從一維到二維數組的完整解決方案

     編輯:PHP 相關知識

一維陣列去重:巧用 array_flip

在 PHP 中處理大量資料時,陣列去重是常見需求。對於一維陣列,最簡潔的寫法莫過於雙重 array_flip():

$arr = array_flip(array_flip($arr));

這行代碼的原理很巧妙:array_flip() 會將陣列的鍵值互換。因為 PHP 陣列不允許重複的鍵名,當值變成鍵名後,重複的值會導致鍵名衝突,PHP 會自動保留最後一個出現的元素。再執行一次 array_flip() 將鍵值換回,即完成去重。

原理演示

$arr1 = array("age" => 30, "name" => "快樂園", "age" => 20);
// 重複鍵名 "age" 會被覆蓋,最終為 20
$arr1 = array_flip($arr1); // 值變鍵,重複值導致鍵衝突被刪除
$arr1 = array_flip($arr1); // 換回原狀,完成去重

二維陣列去重:多種實用方案

一維陣列去重雖簡單,但二維陣列需要更靈活的處理。以下提供三種常見方案:

方案一:降維字串比對法(不保留原鍵名)

function array_unique_fb($array2D) {
    foreach ($array2D as $v) {
        $v = join(",", $v); // 將子陣列轉為逗號分隔字串
        $temp[] = $v;
    }
    $temp = array_unique($temp); // 去重字串
    foreach ($temp as $k => $v) {
        $temp[$k] = explode(",", $v); // 還原為陣列
    }
    return $temp;
}

方案二:降維字串比對法(保留原鍵名)

function array_unique_fb($array2D) {
    foreach ($array2D as $k => $v) {
        $v = join(",", $v);
        $temp[$k] = $v; // 保留原鍵名
    }
    $temp = array_unique($temp);
    foreach ($temp as $k => $v) {
        $array = explode(",", $v);
        // 根據實際字段映射還原結構
        $temp2[$k]["id"] = $array[0];
        $temp2[$k]["litpic"] = $array[1];
        $temp2[$k]["title"] = $array[2];
        // ... 其他字段
    }
    return $temp2;
}

方案三:指定鍵名去重(推薦,效率更高)

function assoc_unique(&$arr, $key) {
    $rAr = array();
    for ($i = 0; $i < count($arr); $i++) {
        if (!isset($rAr[$arr[$i][$key]])) {
            $rAr[$arr[$i][$key]] = $arr[$i];
        }
    }
    $arr = array_values($rAr); // 重置數字索引
}

// 使用範例
$arr = array(
    array('id' => 1, 'name' => 'aaa'),
    array('id' => 2, 'name' => 'bbb'),
    array('id' => 5, 'name' => 'ccc'), // 重複 name
);
assoc_unique($arr, 'name');
print_r($arr);

內建函數 array_unique() 深度解析

PHP 內建的 array_unique() 也能處理一維陣列去重,但有幾個關鍵特性需注意:

  • 保留鍵名:不會重新索引,保留首次出現元素的原始鍵名
  • 字串比較:判斷相等時會將值轉為字串 (string)$elem1 === (string)$elem2
  • 類型敏感:4 和 "4" 會被視為相同,但 4 和 4.0 可能不同

經典範例

$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
/* 輸出:
Array
(
    [a] => green
    [0] => red
    [1] => blue
)
*/

類型轉換陷阱

$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
/* 輸出:
array(2) {
  [0] => int(4)
  [2] => string(1) "3"
}
*/

提示:處理二維陣列時,array_unique() 會報錯「Array to string conversion」,需配合上述降維方案或使用方案三的鍵名比對法。

總結建議

場景推薦方案優點
一維陣列、不保留鍵名array_flip 雙重翻轉代碼極簡、效率高
一維陣列、保留鍵名array_unique()內建函數、語義清晰
二維陣列、按特定欄位去重assoc_unique() 指定鍵名法效率最高、邏輯可控、保留完整結構
二維陣列、整行去重、結構固定降維字串法通用性強、不依賴特定欄位

實際開發中,建議優先使用 指定鍵名去重法(方案三),既高效又能精確控制業務邏輯。針對簡單一維陣列,array_flip(array_flip($arr)) 是最優雅的單行代碼解決方案。

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