
本文介绍使用 PHP 读取文本文件、去除重复行并保持原始内容结构的完整方法,涵盖 file()、array_map('trim')、array_unique() 的正确组合用法及常见陷阱规避。
本文介绍使用 php 读取文本文件、去除重复行并保持原始内容结构的完整方法,涵盖 `file()`、`array_map('trim')`、`array_unique()` 的正确组合用法及常见陷阱规避。
在处理日志、邮箱列表或配置数据等纯文本文件时,常需剔除重复行以保证数据唯一性。PHP 提供了简洁高效的内置函数组合来实现这一目标,但需注意细节——例如换行符残留、数组键重排、空行处理等,否则易导致逻辑错误或输出异常。
✅ 正确做法:三步完成去重
- 读取文件为数组:使用 file() 函数(默认保留换行符);
- 统一清洗每行:用 array_map('trim', $lines) 去除首尾空白及换行符;
- 去重并重置索引:调用 array_unique() 后,再用 array_values() 重排数字键(从 0 开始是正常行为,若需 1-based 索引可后续 array_merge([0 => null], $result) 或直接 foreach 输出)。
以下是完整、健壮的示例代码:
<?php $filename = 'hott.txt';
// 1. 读取文件,每行为数组元素(含 "\n")
$lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
// 2. 去重(自动忽略大小写?需手动 strtolower();此处为严格匹配)
$uniqueLines = array_unique($lines);
// 3. 重置数组键为连续数字索引(0, 1, 2...)
$uniqueLines = array_values($uniqueLines);
// 可选:写回文件或输出
file_put_contents('hott_clean.txt', implode("\n", $uniqueLines) . "\n");
print_r($uniqueLines);
?>
? 关键说明:
- FILE_IGNORE_NEW_LINES 避免每行末尾自带 \n 干扰去重判断;
- FILE_SKIP_EMPTY_LINES 自动跳过空行,防止 '' 被误判为有效重复项;
- array_unique() 仅比较值,不改变原始顺序(PHP 7.2+ 保持首次出现位置);
- array_values() 是解决“键从 0 开始”困惑的正解——这不是错误,而是数组本质;若需 1-based 显示,循环中 $i+1 即可,无需强行修改键。
⚠️ 注意事项
- 编码一致性:确保文件为 UTF-8 无 BOM,否则 trim() 可能失效;
- 内存限制:超大文件(如 >100MB)建议改用流式处理(fopen + fgets),避免内存溢出;
-
大小写敏感:如需忽略大小写去重,先统一转换:
$normalized = array_map('strtolower', $lines); $uniqueKeys = array_keys(array_unique($normalized)); $uniqueLines = array_intersect_key($lines, array_flip($uniqueKeys));
✅ 总结
去除文本文件重复行的核心在于「清洗 → 去重 → 规范化」三步闭环。array_unique() 本身不负责索引重排,array_values() 才是重置键的正确方式;与其纠结键序号,不如聚焦数据准确性与可维护性。配合 FILE_IGNORE_NEW_LINES 和 FILE_SKIP_EMPTY_LINES 标志,即可稳健处理绝大多数场景。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











