array_column本身不负责去重,需配合array_unique等实现二维数组单字段或组合字段去重,推荐array_column+array_unique按单字段去重,保留首次出现项;多字段需手动构造唯一键;array_unique(sort_regular)可直接用于二维数组但效率低且敏感于键序。

PHP 8.0 中,array_column 本身**不负责去重**,但它可以快速提取某列作为去重依据(比如 ID、name),再配合 array_unique 或其他方式实现二维数组去重。关键在于:先用 array_column 拿出用于判断重复的字段值,再结合键名映射还原原数组。
用 array_column + array_unique 实现按单字段去重(推荐)
这是最常用、最简洁的方式,适合按某个唯一字段(如 'id'、'email')去重,保留第一次出现的项:
$data = [
['id' => 1, 'name' => 'Alice', 'age' => 25],
['id' => 2, 'name' => 'Bob', 'age' => 30],
['id' => 1, 'name' => 'Alicia','age' => 26], // 重复 id
['id' => 3, 'name' => 'Charlie','age' => 35],
];
// 提取 id 列,并利用 array_unique 保留首次出现的键
$ids = array_column($data, 'id');
$unique_ids = array_unique($ids);
// 用键名筛选原数组(array_intersect_key 要求键名一致)
$result = array_intersect_key($data, $unique_ids);
// 重置键名(可选,让结果索引连续)
$result = array_values($result);
print_r($result);
// 输出:id=1 的第一条记录被保留,第二条被去掉
按多个字段组合去重(如 name + email)
array_column 不支持直接提取多列组合,需手动构造唯一标识符:
- 遍历数组,拼接目标字段为字符串(如
$item['name'] . '|' . $item['email']) - 用该字符串作临时键,赋值原数组项(自动覆盖重复键)
- 最后用
array_values重置索引
$data = [
['name' => 'Alice', 'email' => 'a@x.com', 'age' => 25],
['name' => 'Bob', 'email' => 'b@x.com', 'age' => 30],
['name' => 'Alice', 'email' => 'a@x.com', 'age' => 26], // 完全重复
];
$unique = [];
foreach ($data as $item) {
$key = $item['name'] . '|' . $item['email'];
$unique[$key] = $item; // 后来者覆盖前者,保留最后一次;若要保留第一次,加 !isset 判断
}
$result = array_values($unique);
注意 array_unique 对二维数组的限制
array_unique($data, SORT_REGULAR) 在 PHP 8.0 中**可以直接作用于二维数组**,但它是逐项比较整个子数组(深度比较),性能较差,且要求结构完全一致(键名顺序、类型都敏感)。不推荐用于大数据量或只需按某字段去重的场景:
// ✅ 可行但低效,且对键顺序敏感 $result = array_values(array_unique($data, SORT_REGULAR)); // ❌ 下面两个数组会被认为不同(即使内容一样),因为键顺序不同: ['name'=>'A','age'=>25] vs ['age'=>25,'name'=>'A']
小技巧:保留最后一次出现的项
上面示例默认保留第一次。如需保留**最后一次**,只需把 array_intersect_key($data, $unique_ids) 改为反向操作:
- 用
array_reverse($data, true)翻转并保持键名 - 再提取列、去重、取交集
- 最后再次翻转回来
$reversed = array_reverse($data, true); $ids = array_column($reversed, 'id'); $unique_ids = array_unique($ids); $result = array_reverse(array_intersect_key($reversed, $unique_ids), true); $result = array_values($result);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











