php 7.2 中二维数组按字段去重需用键值映射法:遍历数组,以指定字段值为键存入辅助数组,仅保留首次出现项;支持非标量字段序列化处理,可封装为兼容函数。

PHP 7.2 中去除二维数组中特定字段的重复,核心思路是:遍历数组,用一个辅助数组记录已出现过的指定字段值,跳过重复项。不依赖高版本函数(如 array_unique 的 FLAG 参数在 7.2 不支持按字段去重),纯原生方式即可高效实现。
用键值映射法保留首次出现的元素
这是最常用、最稳妥的方式。以字段 'name' 为例:
说明:利用 PHP 数组键的唯一性,把目标字段值作为临时键,只保留第一次出现的整条记录。
示例代码:
$data = [
['id' => 1, 'name' => 'Alice', 'age' => 25],
['id' => 2, 'name' => 'Bob', 'age' => 30],
['id' => 3, 'name' => 'Alice', 'age' => 28],
['id' => 4, 'name' => 'Charlie','age' => 35]
];
$seen = [];
$unique = [];
foreach ($data as $item) {
$key = $item['name']; // 指定去重字段
if (!isset($seen[$key])) {
$seen[$key] = true;
$unique[] = $item;
}
}
// $unique 现在只保留 name 首次出现的项
封装成可复用函数
便于多次调用,支持任意字段名:
- 函数接收二维数组和字段名字符串(如
'name'或'email') - 自动检查字段是否存在,避免 Notice 报错
- 默认保留首次出现项;如需保留最后一次,把
$unique[] = $item放到判断外并覆盖即可
函数示例:
function array_unique_by_field($array, $field) {
if (empty($array) || !is_array($array)) return [];
$seen = [];
$result = [];
foreach ($array as $item) {
if (!is_array($item) || !isset($item[$field])) {
continue; // 跳过无效项或缺失字段的元素
}
$val = $item[$field];
$key = is_scalar($val) ? (string)$val : md5(serialize($val));
if (!isset($seen[$key])) {
$seen[$key] = true;
$result[] = $item;
}
}
return $result;
}
// 使用
$filtered = array_unique_by_field($data, 'name');
处理字段值为数组或对象等非标量类型
PHP 数组键必须是字符串或整数,若去重字段可能是数组、对象等,直接赋值会报错或自动转为 "Array" 导致误判。
解决方案:
- 对非标量字段值用
serialize()+md5()生成唯一字符串键 - 或者提前过滤,只处理标量字段(加
is_scalar()判断) - 若业务中该字段绝不会为空或非标量,可省略此层逻辑,提升性能
注意点与避坑提醒
- 区分大小写:若字段值如
'alice'和'Alice'应视为相同,需统一转小写再比较(strtolower($item[$field])) - 空值处理:多个
null或空字符串会被合并,如需保留全部空值,单独分支判断 - 性能:对大数据量(如 >10万行),建议结合数据库去重(
SELECT DISTINCT field, ...)更高效 - PHP 7.2 已停止安全支持,生产环境建议升级至 8.0+,但当前方案完全兼容 7.2
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











