在 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);
PHP 內建的 array_unique() 也能處理一維陣列去重,但有幾個關鍵特性需注意:
(string)$elem1 === (string)$elem24 和 "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)) 是最優雅的單行代碼解決方案。