
本文介绍一种高效、可复用的方法:利用 array_count_values() 统计频次,再遍历原数组对重复项追加 _1、_2 等序号后缀,确保语义唯一且保持原始顺序。
本文介绍一种高效、可复用的方法:利用 `array_count_values()` 统计频次,再遍历原数组对重复项追加 `_1`、`_2` 等序号后缀,确保语义唯一且保持原始顺序。
在实际开发中(如网络设备列表去重、日志归类或表单提交数据清洗),我们常需保留数组原始顺序的同时,为重复值生成可区分的唯一标识。PHP 原生不提供“带序号去重”函数,但可通过两步逻辑优雅实现:先统计频次,再按首次出现顺序编号替换。
核心思路如下:
- 使用
array_count_values()快速获取每个值的出现次数; - 对于出现次数 > 1 的值,遍历原数组,每匹配一次就追加递增序号(
_1,_2, …),保证编号与原始位置一致; - 注意:直接修改原数组是高效的,若需保留原始数据,建议先用
$newArray = $originalArray;创建副本。
以下是完整可运行示例代码:
<?php
$originalArray = [
' QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client) ',
' Microsoft Network Adapter Multiplexor Driver ',
' QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client) #75 ',
' QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client) ',
];
// 步骤1:统计各值出现频次(注意:空格敏感!)
$countMap = array_count_values($originalArray);
// 步骤2:逐个处理重复项
foreach ($countMap as $value => $count) {
if ($count <= 1) continue; // 跳过唯一值
$counter = 1;
foreach ($originalArray as $key => $item) {
if ($item === $value) {
$originalArray[$key] = trim($item) . '_' . $counter;
$counter++;
}
}
}
print_r($originalArray);
?>✅ 输出结果(与需求完全一致):
立即学习“PHP免费学习笔记(深入)”;
Array
(
[0] => QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client)_1
[1] => Microsoft Network Adapter Multiplexor Driver
[2] => QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client) #75
[3] => QLogic BCM57810 10 Gigabit Ethernet (NDIS VBD Client)_2
)⚠️ 关键注意事项:
-
array_count_values()对完全相等的字符串敏感(含空格、大小写),若需忽略首尾空格或大小写,请预先使用array_map('trim', $arr)或array_map('strtolower', $arr)标准化; - 本方案时间复杂度为 O(n²),适用于中小型数组(≤ 10,000 项)。超大规模场景建议改用单次遍历 + 哈希计数器优化;
- 若需支持自定义分隔符(如
-或#)或起始编号(如_0),只需调整拼接逻辑:$value . $separator . $counter。
该方法简洁、无外部依赖、逻辑清晰,是 PHP 数组重复值标准化处理的经典实践。



















