array_unique() 默认保留首次出现元素的原始键,导致数字索引不连续;需用 array_values() 重置为从 0 开始的连续索引。

PHP 的 array_unique() 默认会保留原始键名(对于字符串键),但对数字索引会“断开”——即去重后保留原键,导致索引不连续(比如 [0 => 'a', 2 => 'b', 5 => 'c'])。这不是“乱了”,而是它本就不重排索引。要恢复为从 0 开始的连续数字索引,只需在去重后调用 array_values()。
为什么索引看起来“乱了”?
array_unique() 的设计原则是**保留首次出现元素的原始键**。对纯数字索引数组,它不会自动重置键为 0,1,2…,而是留下稀疏索引(如跳过被删元素的键)。这容易让人误以为“出错了”,其实完全符合文档行为。
一步解决:用 array\_values() 重置索引
这是最常用、最直接的方法:
$arr = [1, 2, 2, 3, 1]; $unique = array_unique($arr); // [0=>1, 1=>2, 3=>3] $fixed = array_values($unique); // [0=>1, 1=>2, 2=>3]
-
array_values()提取所有值并重新赋予 0 开始的连续整数键 - 它不改变值顺序,也不影响去重逻辑,安全可靠
- 适用于所有 PHP 版本(包括老版本)
其他常见需求补充
如果还需保持键值关联(比如关联数组去重按值)、或按特定字段去重,可组合使用:
- 按值去重并重排索引:
array_values(array_unique($arr)) - 关联数组去重(保留第一个出现的键):
array_unique($arr, SORT_REGULAR)+array_values()(若需重排) - 多维数组去重:PHP 原生
array_unique()不支持,需用array_column()+array_unique()提取唯一列,再用array_intersect_key()过滤,最后array_values()
注意避免的误区
不要手动遍历重建索引(如 foreach + [] 赋值),既冗余又易错;也不要依赖 array_merge([], $arr)——它虽能重排,但语义不清且性能略差;更不要用 ksort(),它按键排序而非重排索引。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











