本文详解如何在 php 中向文件写入数组数据时防止重复追加,涵盖清空重写、内容比对去重两种策略,并提供可直接运行的代码示例与关键注意事项。
在使用 file_put_contents() 向文件写入数据时,若反复执行且始终传入 FILE_APPEND 标志,就会导致历史数据不断累积——正如问题中所示:每次运行脚本,Fanny, 1034 等记录都被重复追加,造成数据冗余。根本原因在于:FILE_APPEND 仅负责“追加”,不负责“判断是否已存在”。
✅ 方案一:覆盖写入(适用于每次全量更新场景)
若每次运行脚本都应以当前 $result 数组为唯一权威数据源(即旧数据完全失效),最简单高效的方式是移除 FILE_APPEND,让 file_put_contents() 默认以覆盖模式写入:
$dir = "C:/Users/<users>/data";
if (!is_dir($dir)) {
mkdir($dir, 0777, true); // 添加第三个参数 true 支持递归创建
}
$dataLines = [];
foreach ($result as $item) {
// 注意:原代码中误用了 $data(应为 $asset),且部分键名为 asset_no
$name = $item[0]['name'] ?? '';
$asset = $item[0]['asset'] ?? $item[0]['asset_no'] ?? '';
$dataLines[] = "$name, $asset";
}
// 覆盖写入(无 FILE_APPEND)→ 自动清除旧内容
file_put_contents("$dir/data", implode("\r\n", $dataLines) . "\r\n");
✅ 优点:简洁、高效、无读取开销;
⚠️ 注意:确保 $result 始终包含完整最新数据集,否则会丢失未包含的条目。
✅ 方案二:智能去重追加(适用于增量更新或需保留历史逻辑)
若需保留文件中已有数据,并仅追加 $result 中尚未存在的新记录(例如按 name 或 name+asset 组合去重),则需先读取并解析现有内容: