PHP 8.1 中二维数组去重关键在于明确逻辑:整行去重用 array_unique($rows, SORT_REGULAR);单字段去重用哈希标记法(如 $row['id']);多字段组合去重则构造复合键(如 url.'|'.xyz)。

PHP 8.1 中对数据库查询结果(即二维数组)去重,关键不在于版本差异,而在于**明确去重逻辑**:是整行完全相同才去重?还是只按某几个字段(如 id、email、url)判断重复?不同场景适用不同方法。下面分三种常见情况说明,均兼容 PHP 8.1+,无需额外扩展。
按整行内容严格去重(结构+值完全一致)
适用于「两条记录每个键和值都一模一样」才视为重复的情形。PHP 8.1 支持 SORT_REGULAR 模式下的 array_unique() 直接处理关联二维数组:
- 调用
array_unique($rows, SORT_REGULAR)即可,它会逐项比较子数组的键名与值,保留首次出现的完整行 - 注意:数字索引会被保留,但键顺序不变;若需连续数字键,最后加
array_values() - 示例:
$unique = array_values(array_unique($dbResult, SORT_REGULAR));
按指定字段去重(如只看 id 或 email)
最常见于数据库结果——同一用户多条记录(含不同时间戳),只需留一条。推荐用「哈希标记法」,清晰、高效、无序列化风险:
- 初始化空数组
$seen = []和结果容器$unique = [] - 遍历每行:
foreach ($dbResult as $row) - 提取去重依据字段,例如
$key = $row['id']或$key = $row['email'] ?? '' - 检查
!isset($seen[$key]),成立则$seen[$key] = true并$unique[] = $row - 该方式天然支持保留第一条,如需保留最新一条(如按
created_at排序后执行),先usort()再跑此逻辑
按多个字段组合去重(如 url + xyz 字段)
当单个字段不足以唯一标识(比如不同接口返回同 url 但不同参数),需联合判断:
立即学习“PHP免费学习笔记(深入)”;
- 构造复合键,例如
$key = $row['url'] . '|' . ($row['xyz'] ?? '') - 或更安全的方式:
$key = md5(serialize([$row['url'], $row['xyz']]))(避免特殊字符干扰) - 后续仍用
$seen数组标记,逻辑同上 - 若字段可能为 null/数组/对象,务必先做类型归一化(如强制转字符串),否则哈希不稳定
不建议在 PHP 8.1 中使用 serialize/unserialize 全量去重,虽可行但有性能开销、不可序列化内容报错风险,且无法灵活控制保留哪条。按字段标记法更可控、易调试、语义清晰。



















