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

PHP 數組去重進階:支持多維數組/對象的 m_ArrayUnique 實現原理解析

     編輯:PHP 相關知識

痛點:array_unique() 的局限性

內置 array_unique() 僅支持 字符串/數值 值的去重。當數組元素是 數組 或 對象 時會拋出警告並失效。

解決方案:序列化 + array_unique + 反序列化

<?php
/**
 * 多維數組/對象去重
 * @param array  $arr        待去重數組
 * @param bool   $reserveKey 是否保留原鍵名
 * @return array 去重後數組
 */
function m_ArrayUnique($arr, $reserveKey = false) {
    if (!is_array($arr) || empty($arr)) return $arr;

    $tmpArr = [];
    foreach ($arr as $key => $value) {
        // 序列化統一為字符串,保留類型結構
        $tmpArr[$key] = serialize($value);
    }

    // 利用內置去重
    $tmpArr = array_unique($tmpArr);

    // 反序列化還原
    $result = [];
    foreach ($tmpArr as $key => $value) {
        if ($reserveKey) {
            $result[$key] = unserialize($value);
        } else {
            $result[] = unserialize($value); // 重建索引
        }
    }
    return $result;
}

核心原理圖解

  1. 序列化:將複雜結構(數組/對象)轉為唯一字符串表示,如 a:2:{i:0;s:1:"a";i:1;s:1:"b";}
  2. 去重:array_unique 在字符串層面高效去重。
  3. 反序列化:還原原始數據結構與類型。

使用示例

$data = [
    ['id' => 1, 'name' => 'A'],
    ['id' => 2, 'name' => 'B'],
    ['id' => 1, 'name' => 'A'], // 重複
    (object)['id' => 3, 'name' => 'C'],
    (object)['id' => 3, 'name' => 'C'], // 重複對象
];

$unique = m_ArrayUnique($data, true); // 保留鍵名
print_r($unique);
/*
Array
(
    [0] => Array ( [id] => 1 [name] => A )
    [1] => Array ( [id] => 2 [name] => B )
    [3] => stdClass Object ( [id] => 3 [name] => C )
)
*/

性能與注意事項

  • 性能:序列化/反序列化有開銷,超大數組(>10萬元素)建議用哈希映射(如 spl_object_hash)優化。
  • 對象比較:同類對象屬性順序、可見性不同會導致序列化字符串不同,視為不同值。
  • 資源類型:資源類型無法序列化,會報錯。

延伸閱讀

  • 二維數組去重與 array_unique 進階用法
  • PHP array_flip 實現鍵值交換去重
  • JS 判斷數組重複值方法
  • PHP 二維數組去重方法總結
  • MySQL 重設自增起始值
  • PHP 數組並集/交集/差集函數
  • PHP 清除數組空值元素
  • PHP 刪除數組首尾元素
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved