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

PHP 三維數組去重:基於 MD5+JSON 序列化的通用方案

     編輯:PHP 相關知識

問題場景

多維數組(如 API 返回的列表)包含重複子項,需保留唯一值。array_unique 僅支援一維,且嚴格模式下對象/數組比較失效。

通用解法:MD5(JSON) 指紋

$my_array = [ /* 三維數據 */ ];

$tmp_hashes = [];
$new_array = [];

foreach ($my_array as $k => $val) {
    // 序列化為 JSON 再 MD5,得到唯一指紋
    $hash = md5(json_encode($val, JSON_UNESCAPED_UNICODE | JSON_SORT_KEYS));
    
    if (in_array($hash, $tmp_hashes)) {
        continue; // 重複,跳過
    }
    $tmp_hashes[] = $hash;
    $new_array[] = $val;
}

// $new_array 即為去重後數組
print_r($new_array);

關鍵點解析

  • json_encode 將結構扁平化為字串,JSON_SORT_KEYS 確保鍵序一致(避免鍵順序不同導致誤判)。
  • md5 產生定長指紋,比較效率 O(1)。
  • 空間換時間:用 $tmp_hashes 陣列存儲已見指紋。

效能優化

  • 大數據量(>10萬條)建議用 array_flip 將指紋作鍵,isset 判斷 O(1)。
  • 若子項包含資源/對象,需先實現 __serialize 或轉陣列再序列化。

替代方案

// PHP 7.2+ 可用 array_unique + SORT_REGULAR(需子項可序列化)
$unique = array_unique($my_array, SORT_REGULAR); 
// 但對象比較仍可能失效,MD5+JSON 更穩健
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved