PHP数组去重array_unique与多维数组处理 PHP

前言

一维数组去重直接用 array_unique,但多维数组(如查询结果行)直接调用会报错或按序列化比较失效。很多人在处理列表、标签去重时踩这个坑。本文讲解一维去重、按指定键去重、保留首次出现、多维数组的正确写法。

操作步骤

1. 一维数组去重

$arr = [1,2,2,3,3,3];
$unique = array_unique($arr);

返回保留首次出现的结果,注意键名不重排。

2. 重置键名

$unique = array_values(array_unique($arr));

3. 按关联数组某个键去重(多维)

$rows = [
    ['id'=>1,'name'=>'a'],
    ['id'=>2,'name'=>'b'],
    ['id'=>1,'name'=>'a'],
];
$seen = [];
$result = array_filter($rows, function($row) use (&$seen){
    $key = $row['id'];
    if (isset($seen[$key])) return false;
    $seen[$key] = true;
    return true;
});
$result = array_values($result);

4. 标签字符串去重

$tags = ['php','mysql','php','nginx'];
$tags = array_values(array_unique($tags));

5. 不区分大小写去重

$lower = array_unique(array_map('strtolower', $arr));

常见坑

  1. array_unique 对多维数组按序列化比较,结果不符合预期。
  2. 去重后键名保留原索引,foreach 或 JSON 输出可能出现空洞。
  3. 数字和字符串被当作不同值,严格比较需注意。
  4. 浮点数直接比较可能因精度重复判断失误。
  5. 大数组遍历去重性能差,先用键做映射更快。
  6. 关联数组按值去重要选唯一业务键,不能用整个行比较。
  7. 去重顺序依赖首次出现位置,不要假设排序。

总结

一维用 array_unique + array_values 重置键;多维用辅助数组按业务键标记去重。比较前统一大小写和类型,大数组优先用键映射。理解 array_unique 按值比较的特性,多维场景自己实现才不会出错。

遇到问题加QQ23979811 协助处理


emer 发布于  2026-11-14 07:19 

PHP 数组去重与排序实战

PHP 数组去重与排序实战

一、为什么数组处理是 PHP 基本功

PHP 数组是万能数据结构,接口返回的列表、数据库结果集、表单提交数据都以数组形式存在。日常开发中最常见两个需求:去除重复元素、按字段排序。很多新手用双重循环去重、手写冒泡,既慢又容易出 bug。PHP 内置函数已经把这些操作封装好,关键是分清索引数组和关联数组的不同处理方式。

二、array_unique 去重

最简单的一维数组去重用 array_unique,它保留第一次出现的值,后面重复的被丢弃:

<?php
$ids = [3, 1, 3, 2, 1, 4];
$unique = array_unique($ids);
// 结果 [3,1,2,4],注意键名保留原始索引
print_r($unique);

两点注意:一是去重后键名不连续,需要配合 array_values 重新索引;二是它按字符串比较,数字 1 和字符串 "1" 会被视为相同。

$clean = array_values(array_unique($ids));

三、二维数组按字段去重

查询结果是二维数组,要按某个键去重,array_unique 直接用会失效,常用键值映射法:

$rows = [
    ['uid' => 1, 'name' => '张三'],
    ['uid' => 2, 'name' => '李四'],
    ['uid' => 1, 'name' => '张三'],
];
$map = [];
foreach ($rows as $row) {
    $map[$row['uid']] = $row;
}
$result = array_values($map);

利用关联数组键唯一的特性,重复 uid 自动覆盖,最后 array_values 重置索引,时间复杂度 O(n),比双重循环 O(n²) 高效得多。

四、常用排序函数区别

PHP 排序函数容易记混,先分清三组:

  • sort() / rsort():按值升序/降序,重建索引,适合索引数组;
  • asort() / arsort():按值排序但保留键名,适合关联数组;
  • ksort() / krsort():按键名排序。
    $scores = ['张三' => 88, '李四' => 95, '王五' => 76];
    asort($scores); // 按分数升序,保留人名键

五、二维数组按字段排序

多维数组按某个字段排序,用 usort 配合比较回调:

usort($rows, function ($a, $b) {
    return $b['score'] <=> $a['score']; // 分数降序
});

飞船运算符 <=> 返回 -1、0、1,直接作为比较结果,比写 if 判断简洁。PHP 8 之后也可用 array_multisort,但 usort 可读性更好。

六、去重排序常见坑

  1. array_unique 后忘记 array_values,导致 JSON 转成对象而非数组;
  2. 二维数组直接传 array_unique,比较的是数组句柄而不是字段;
  3. usort 回调返回非整数,排序结果不稳定;
  4. 大量数据排序时注意内存,不要在循环里反复排序整个数组。

七、总结

一维去重用 array_unique + array_values,二维按键去重用关联数组映射,按字段排序用 usort + 飞船运算符。理解索引数组与关联数组的键名保留规则,就能避开大部分数组处理坑。日常写业务代码优先用内置函数,性能和可读性都有保障。


emer 发布于  2026-11-14 07:17 
'); })();