多个file_put_contents仅最后一个生效,求问题原因
问题原因与解决方案
核心原因
你每次执行preg_replace时,都是基于最初读取的原始文件内容进行替换,而非上一次修改后的内容。同时,每次调用file_put_contents都会直接覆盖整个文件,导致前两次的修改结果被第三次基于原始内容的替换完全覆盖,最终只有最后一次修改生效。
修复方案
方案1:链式传递替换结果,一次性写入
将每次替换后的结果保存到$file_content变量中,最后统一写入文件:
$dir = 'path/to/file'; $file_content = file_get_contents($dir); // 基于上一次的替换结果继续修改 $file_content = preg_replace($find_first_data, $replace_first_data, $file_content); $file_content = preg_replace($find_second_data, $replace_second_data, $file_content); $file_content = preg_replace($find_third_data, $replace_third_data, $file_content); // 一次性写入所有修改 file_put_contents($dir, $file_content);
方案2:使用数组参数批量替换
利用preg_replace支持数组参数的特性,一次完成所有替换操作:
$dir = 'path/to/file'; $file_content = file_get_contents($dir); // 定义查找规则和替换内容的数组 $patterns = [ '/\$first_data = \d;/', '/\$second_data = \d;/', '/\$third_data = \d;/' ]; $replacements = [ '$first_data = ' . $process_first_data . ';', '$second_data = ' . $process_second_data . ';', '$third_data = ' . $process_third_data . ';' ]; // 批量替换并写入文件 $file_content = preg_replace($patterns, $replacements, $file_content); file_put_contents($dir, $file_content);
两种方案都能确保所有修改都基于最新的内容,且仅写入一次文件,既解决了覆盖问题,也提升了操作效率。
内容的提问来源于stack exchange,提问作者yobebix932
相关产品推荐
相关产品推荐

