array_values() 是最直接安全的重新索引方式,它提取所有值生成从0开始的连续数字索引;而 array_unique() 默认保留原键名导致索引空洞,必须套在其外才能实现去重+重排双重效果。

array_values() 是最直接、最安全的重新索引方式。它不关心原数组键名,只提取所有值并生成从 0 开始的连续数字索引。
为什么不能只用 array_unique()?
array_unique() 默认保留原始键名,不会重排索引。比如:
$arr = ['a', 'b', 'a', 'c']; $result = array_unique($arr); // 结果是:Array ( [0] => a [1] => b [3] => c ) —— 缺了索引 2,且键不连续
这种“空洞索引”在 for 循环、JSON 序列化或前端消费时容易出错。
array_values() 必须套在 array_unique() 外面
顺序不能反,否则会先重排再重复判断(失去去重意义):
- ✅ 正确:
$result = array_values(array_unique($arr)); - ❌ 错误:
$result = array_unique(array_values($arr));(array_values()已丢键,再array_unique()没问题但多此一举)
注意:array_values() 会把所有键强制转为整型索引,关联键名彻底丢失 —— 如果你本就用的是关联数组且需要保留键,请别用它。
立即学习“PHP免费学习笔记(深入)”;
二维数组去重后重新索引要小心
array_unique() 对二维数组无效(PHP 8.0+ 报 Warning),必须手动处理。常见做法是按某个字段去重,再用 array_values() 收尾:
$data = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice']
];
$seen = [];
$unique = [];
foreach ($data as $item) {
if (!in_array($item['id'], $seen, true)) {
$seen[] = $item['id'];
$unique[] = $item;
}
}
$result = array_values($unique); // 这一步才真正重排索引
漏掉 array_values(),$unique 的键可能还是 0、1、3 这类跳跃值 —— 尤其当你中间用了 unset() 或条件跳过时。
排序后再去重,索引还得重来一次
如果先 sort() 再 array_unique(),结果仍是带空洞的数字键;反之,先 array_unique() 再 sort(),虽然值有序,但键仍不连续。无论哪种顺序,只要最终要干净的 0,1,2... 索引,array_values() 都不可省略。
最容易被忽略的点:它只作用于**最外层数组**。嵌套结构里的子数组索引不会自动重排,得单独处理。



















