PHP二维数组去重的三种实用方法

拾光
拾光
发布时间:2026-10-15| 5人浏览过
原创

在处理多维数据结构时,一维数组的去重可通过内置函数轻松完成,但二维数组因包含嵌套结构,直接应用去重逻辑较为复杂。本文将解析三种针对不同需求的PHP二维数组去重策略:基础通用去重、保留原始键值的定制去重,以及基于特定字段的关联数组去重。

目标与准备

在进行二维数组去重前,需明确业务场景对数据完整性的要求。如果仅需要去除内容完全相同的重复行且不在乎原始索引顺序,可使用字符串转换法;若需保留原数组的键名映射(例如后续需要通过索引快速访问),则需采用带键名处理的逻辑;若仅需依据某个关键列(如“名称”或“ID”)剔除重复记录,则应使用基于关键字段的过滤算法。

方法一:通用二维数组去重(忽略键值)

此方法适用于不需要保留原始内部数组键名,仅需去除内容重复行的场景。核心思路是将每一行子数组序列化为逗号分隔的字符串,利用array_unique()去重后再还原为数组。

第1步:执行通用去重函数

定义函数 array_unique_fb,遍历传入的二维数组 $array2D。将每个子数组通过 join(",", $v) 转换为字符串存入临时数组 $temp。调用 array_unique($temp) 剔除重复字符串,再遍历结果使用 explode(",", $v) 将字符串重新分割为数组结构并返回。

// 二维数组去掉重复值
function array_unique_fb($array2D)
{
    foreach ($array2D as $v) {
        $v = join(",", $v); // 降维,也可以用implode,将一维数组转换为用逗号连接的字符串
        $temp[] = $v;
    }
    $temp = array_unique($temp); // 去掉重复的字符串,也就是重复的一维数组
    foreach ($temp as $k => $v) {
        $temp[$k] = explode(",", $v); // 再将拆开的数组重新组装
    }
    return $temp;
}

方法二:保留原始键值的去重

当业务逻辑依赖原始数组的键名(Key)时,上述方法会导致键名丢失或被重置。此方案在去重同时保留了键名映射。注意:该方法在代码示例中硬编码了字段位置,实际使用中应根据具体数据结构调整拆分逻辑。

第1步:执行保留键名的去重逻辑

遍历二维数组时,不仅保存字符串化后的值,还需保留对应的键名 $k 存入 $temp[$k]。去重后,再次遍历 $temp,将字符串拆分并重新组装到新的数组 $temp2 中。示例代码展示了如何根据逗号分隔的顺序依次赋值给 id, litpic, title 等字段,最后返回 $temp2。

// 二维数组去掉重复值 并保留键值
function array_unique_fb($array2D)
{
    foreach ($array2D as $k => $v) {
        $v = join(",", $v); // 降维,也可以用implode,将一维数组转换为用逗号连接的字符串
        $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];
        $temp2[$k]["address"] = $array[3];
        $temp2[$k]["starttime"] = $array[4];
        $temp2[$k]["endtime"] = $array[5];
        $temp2[$k]["classid"] = $array[6];
        $temp2[$k]["ename"] = $array[7];
    }
    return $temp2;
}

风险提示:该代码示例中假设子数组元素顺序固定且数量一致。若数据来源不可控,建议根据实际字段名动态匹配,而非硬编码索引。

方法三:基于关键字段的关联数组去重

对于包含命名键(Associative Array)的二维数据,通常需要根据某一特定字段(如 “name” 或 “id”)的唯一性来去重,而非比较整行数据。assoc_unique() 函数提供了一种更灵活的方式。

第1步:定义并按关键字段去重

创建函数 assoc_unique(&$arr, $key),其中 &$arr 表示传入数组的引用,修改将直接影响原变量。$key 指定用于判断重复的字段名。创建一个空数组 $rAr 用于存储不重复的行。遍历原数组,检查当前行的 $arr[$i][$key] 是否已存在于 $rAr 的键中。若不存在,则以该字段的值作为键,将整行数据存入 $rAr。最后使用 array_values($rAr) 重新索引数组并替换原数组。

<?php
$arr = array(
    array('id' => 1,'name' => 'aaa'),
    array('id' => 2,'name' => 'bbb'),
    array('id' => 3,'name' => 'ccc'),
    array('id' => 4,'name' => 'ddd'),
    array('id' => 5,'name' => 'ccc'),
    array('id' => 6,'name' => 'aaa'),
    array('id' => 7,'name' => 'bbb'),
);

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);
}

assoc_unique(&$arr, 'name');
print_r($arr);
?>

总结

PHP处理二维数组去重的关键在于选择合适的数据对比维度。全量比对适合简单的列表清洗,保留键值适合后端接口返回结构调整,而关键字段去重则是数据库查询结果预处理中最常用的手段。开发者应根据数据结构的稳定性和业务对索引的需求,选择对应的实现方式。以上就是PHP二维数组去重的详细内容,更多关于PHP数据处理技巧的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。