array_splice不适用于直接去重,因其依赖已知索引而重复项位置未知;推荐用array_unique配合serialize,或按指定键(如id)提取唯一键后重新索引。

PHP 7.3 中 array_splice 本身**不用于删除重复项**,它只是切割并替换数组片段的工具。要删除二维数组中的重复项(比如按某几个字段去重),需配合其他函数如 array_unique(需先序列化)或手动遍历比对。array_splice 可在手动去重过程中用来“移除”发现的重复元素,但不是核心去重手段。
为什么 array_splice 不适合直接去重
array_splice 的作用是:从数组中移除指定位置的一段元素,并可选插入新元素。它依赖已知键名或索引位置,而重复项的位置事先未知,无法直接调用一次就删完所有重复。强行用它做去重,逻辑复杂、效率低、易出错。
推荐方案:用 array_unique + serialize 去重(最简洁)
二维数组不能直接传给 array_unique(PHP 7.3 默认只支持一维),但可以先将每行转为字符串再还原:
$original = [
['id' => 1, 'name' => 'Alice'],
['id' => 2, 'name' => 'Bob'],
['id' => 1, 'name' => 'Alice'], // 重复
['id' => 3, 'name' => 'Charlie']
];
<p>// 序列化每一行 → 去重 → 反序列化
$unique = array_map('unserialize', array_unique(array_map('serialize', $original)));</p><p>print_r($unique);
// 输出含 3 个元素,重复项已被剔除
</p>手动遍历 + array_splice 实现(仅作理解,不推荐生产)
若坚持用 array_splice,需双层循环比对,从后往前删(避免键偏移):
- 外层用
for ($i = count($arr) - 1; $i >= 0; $i--)倒序遍历 - 内层检查
$i之前是否存在完全相同的子数组(用==或===) - 若存在,调用
array_splice($arr, $i, 1)删除当前项
注意:此方式时间复杂度 O(n²),大数据量极慢,且 PHP 7.3 对数组比较的严格性可能影响结果(如键顺序不同会被视为不等)。
按指定键去重(更实用的场景)
多数时候你只想根据某个字段(如 'id')去重,而非整行完全一致:
- 用
array_column($arr, 'id')提取所有 id - 用
array_keys(array_unique(...))获取首次出现的键 - 用这些键重新索引原数组:
$result = array_intersect_key($arr, array_flip($keys))
这样既高效又可控,也无需动用 array_splice。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











