array_unique() 是最省事的去重方法,适用于绝大多数标量一维数组场景;需注意键名重排、类型比较模式及嵌套数组需序列化等边界处理。

直接用 array_unique() 最省事
绝大多数场景下,你不需要手动遍历去重——array_unique() 就是为此而生的。它内部已做优化,比手写循环快得多,且能正确处理关联数组的键名保留逻辑。
常见错误是调用后没注意键名变化:索引数组的数字键会“断掉”,比如 [0 => 1, 1 => 2, 3 => 3, 4 => 4];如果后续依赖连续整数索引(如 JSON 输出、前端渲染),得补上 array_values():
$arr = [1, 2, 2, 3, 4, 4]; $unique = array_values(array_unique($arr)); // → [0=>1, 1=>2, 2=>3, 3=>4]
-
array_unique()默认按字符串比较(SORT_STRING),所以4和"4"被视为相同,只留第一个出现的(通常是4) - 要严格区分类型,传
SORT_REGULAR:array_unique($arr, SORT_REGULAR) - 对中文或带 locale 的字符串排序需求,用
SORT_LOCALE_STRING
手动遍历时必须用 in_array($value, $unique, true)
如果你真要自己遍历(比如需嵌套判断、跳过空值、或兼容 PHP in_array() 的第三个参数 true 是关键。漏掉它会导致类型隐式转换,引发误判:
$arr = [0, "0", false, null, ""];
$unique = [];
foreach ($arr as $v) {
if (!in_array($v, $unique, true)) { // 必须加 true!
$unique[] = $v;
}
}
// 结果:[0, "0", false, null, ""] 全部保留
// 若不加 true,则 0/"0"/false/null/"" 全被当成相同,只剩第一个 0
- 不加
true时,in_array()做松散比较(==),0 == false、0 == ""都为真 - 即使你确定数据全是整数,也建议显式写
true—— 防止后续数据源变更引入字符串 - 性能上,
in_array()在大数组里是 O(n) 查找,整体变成 O(n²),超 1 万元素就明显变慢
用 isset() + 键赋值法要注意值类型限制
想绕过 in_array() 的性能瓶颈?可以用“以值为键”的技巧,靠 PHP 键的唯一性天然去重:
立即学习“PHP免费学习笔记(深入)”;
$arr = ["apple", "banana", "apple"];
$unique = [];
foreach ($arr as $v) {
$unique[$v] = true; // 重复的 $v 会覆盖同一键
}
$result = array_keys($unique); // → ["apple", "banana"]
- 这方法快(O(n)),但仅适用于值能安全作键的情形:不能是
null、array、object或空字符串(""会被转成0键) - 所有键都会被强制转成字符串,所以
1和"1"会冲突,只留一个 - 原始顺序无法保证(PHP 数组键顺序在 7.3+ 才稳定,且该法依赖插入顺序,但不推荐依赖)
多维数组或对象数组不能用 array_unique()
array_unique() 对一维标量数组有效,但遇到二维数组、对象或含数组的值,会直接报 Warning 并返回原数组 —— 它根本不会递归比较。
例如:
$users = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'] // 重复项
];
var_dump(array_unique($users)); // Warning: Array to string conversion
- 真要处理这种结构,得先序列化每行:
array_unique(array_map('serialize', $users)),再反序列化 - 更稳妥的做法是提取唯一标识字段(如
id),用array_column()+array_keys()筛选原始索引 - 对象数组需实现
__toString()或用spl_object_hash()辅助判断,但通常应避免直接去重对象,改用 ID 映射
array_unique();需要控制比较逻辑或兼容老版本,才手动遍历;而一旦涉及嵌套或非标量,就得跳出函数思维,先定义“什么是重复”——这个判断本身,往往比去重动作更关键。



















