php如何过滤重复的数组?

PHP过滤重复数组最常用array_unique(),适用于一维数组并保留首次出现元素及原始键名;多维数组需用serialize/array_map或手动遍历实现去重,按字段去重则需结合临时数组判断。

PHP过滤重复数组最常用的方法是用 array_unique(),它能直接去掉一维数组中的重复值,保留首次出现的元素。

基础用法:去重并保持键名

array_unique() 默认保留原始键名(不是数字索引),适合关联数组或需要维持键值对应关系的场景:

$arr = ['a', 'b', 'a', 'c', 'b'];
$result = array_unique($arr);
// 结果:['a'=> 'a', 'b'=> 'b', 'c'=> 'c']

注意:返回的是新数组,原数组不变;重复值被完全移除,只留第一个出现的。

处理多维数组(不能直接用 array_unique)

PHP 原生 array_unique() 不支持多维数组,会报错或返回空。常见解决方式:

  • json_encode() 把每行转成字符串再去重,再 json_decode() 还原
  • array_column() + array_unique() 提取某列去重(适用于按某个字段去重)
  • 手动遍历 + in_array()serialize() 判断是否已存在

简单示例(按整行去重):

$arr2d = [['id'=>1, 'name'=>'Tom'], ['id'=>2, 'name'=>'Jack'], ['id'=>1, 'name'=>'Tom']];
$unique = array_map('unserialize', array_unique(array_map('serialize', $arr2d)));

去重后重置数字索引

如果希望得到连续的数字键(如 0,1,2…),用 array_values() 重新索引:

$arr = ['a', 'b', 'a', 'c'];
$clean = array_values(array_unique($arr));
// 结果:[0=>'a', 1=>'b', 2=>'c']

按特定字段去重(比如二维数组中按 'id' 去重)

更实用的场景:保留每个 id 第一次出现的完整记录:

  • 遍历数组,用一个临时键名数组记录已出现的 id
  • 遇到新 id 才追加到结果中

代码片段:

$data = [['id'=>1, 'val'=>'x'], ['id'=>2, 'val'=>'y'], ['id'=>1, 'val'=>'z']];
$seen = [];
$result = [];
foreach ($data as $item) {
    if (!in_array($item['id'], $seen)) {
        $result[] = $item;
        $seen[] = $item['id'];
    }
}

基本上就这些。一维用 array_unique(),多维或按字段去重就得自己控制逻辑,不复杂但容易忽略键名和数据结构的影响。