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() 不支持多维数组,会报错或返回空。常见解决方式:
立即学习“PHP免费学习笔记(深入)”;
- 用 json_encode() 把每行转成字符串再去重,再 json_decode() 还原
- 用 array_column() + array_unique() 提取某列去重(适用于按某个字段去重)
- 手动遍历 + in_array() 或 serialize() 判断是否已存在
简单示例(按整行去重):
本文档主要讲述的是j2me3D游戏开发简单教程; 如今,3D图形几乎是任何一部游戏的关键部分,甚至一些应用程序也通过用3D形式来描述信息而获得了成功。如前文中所述,以立即模式和手工编码建立所有的3D对象的方式进行开发速度很慢且很复杂。应用程序中多边形的所有角点必须在数组中独立编码。在JSR 184中,这称为立即模式。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
$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(),多维或按字段去重就得自己控制逻辑,不复杂但容易忽略键名和数据结构的影响。










