
本文介绍如何使用 php 高效比对两个文本文件,精准提取仅存在于第二个文件中、而第一个文件中不存在的行,并支持直接用于后续邮件发送等业务逻辑。
本文介绍如何使用 php 高效比对两个文本文件,精准提取仅存在于第二个文件中、而第一个文件中不存在的行,并支持直接用于后续邮件发送等业务逻辑。
在日常运维或数据同步场景中,常需识别新增记录——例如操作员上传更新文件(.data.txt)后,需快速定位其中相对于基准文件(.data1.txt)新增的条目。PHP 提供了简洁可靠的数组操作能力,无需逐行暴力遍历即可高效完成该任务。
核心思路:基于 array_diff() 的集合差集运算
PHP 的 array_diff() 函数可返回第一个数组中存在、但其他数组中均不存在的值。因此,要获取「仅在 .data.txt 中出现、而不在 .data1.txt 中」的行,只需将 $list2 作为第一参数、$list1 作为第二参数调用该函数:
<?php
// 方法一:逐行读取(内存友好,推荐用于中等规模文件)
$list1 = [];
$list2 = [];
if ($file1 = fopen('.data1.txt', 'r')) {
while (!feof($file1)) {
$line = fgets($file1);
if ($line !== false) {
$list1[] = trim($line); // 去除换行符与首尾空格,避免因空白差异导致误判
}
}
fclose($file1);
}
if ($file2 = fopen('.data.txt', 'r')) {
while (!feof($file2)) {
$line = fgets($file2);
if ($line !== false) {
$list2[] = trim($line);
}
}
fclose($file2);
}
// 计算差集:仅存在于 .data.txt 而不在 .data1.txt 中的行
$uniqueLines = array_diff($list2, $list1);
// 输出结果(可用于邮件正文、日志记录或进一步处理)
foreach ($uniqueLines as $line) {
echo htmlspecialchars($line) . '<br>'; // 安全输出,防止 XSS(若用于 HTML 环境)
}
?>更简洁写法(适用于小文件,代码更紧凑)
若文件体积较小(如数百行以内),可直接使用 file_get_contents() + explode() 一行加载:
本文档主要讲述的是Android服务Service_详解;服务(Service)是Android系统中4个应用程序组件之一(其他的组件详见3.2节的内容)。服务主要用于两个目的:后台运行和跨进程访问。通过启动一个服务,可以在不显示界面的前提下在后台运行指定的任务,这样可以不影响用户做其他事情。通过AIDL服务可以实现不同进程之间的通信,这也是服务的重要用途之一。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看
<?php
$list1 = array_map('trim', file('.data1.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
$list2 = array_map('trim', file('.data.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES));
$uniqueLines = array_diff($list2, $list1);
// 输出并收集为字符串(便于后续邮件发送)
$output = implode("\n", $uniqueLines);
echo nl2br(htmlspecialchars($output));
?>✅ 关键注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 必须使用 trim() 或 FILE_IGNORE_NEW_LINES 清理换行符,否则相同内容因 \n/\r\n 差异会被判定为不匹配;
- array_diff() 区分大小写和空白字符,请确保原始数据格式一致;
- 若文件含重复行且需去重,可在 array_diff 前对数组调用 array_unique();
- 对于超大文件(如 >10MB),建议改用流式比对或外部工具(如 comm 命令),避免内存溢出。
该方案结构清晰、执行高效,可无缝集成至自动化脚本中——例如将 $output 变量直接传入 mail() 函数或 SMTP 库,实现“发现即通知”的运维闭环。










