我有一个像这样的文本文件:
1
2
3
4
5
6
7
8
9
10
我想删除数字在这样的数组中的特定行:
$myfile='txt.txt';
$remove=array(1,3,6,7,10);
//wanna remove these lines
所以我尝试了这段代码,但是没有用,只是使文本加倍并破坏了所有内容:
<?php
$myfile='txt.txt';
$remove=array(1,3,5,7,10);
$lines=file($myfile);
$countline=sizeof($lines);
$data=file_get_contents($myfile);
for ($i=0; $i < $countline+1; $i++) {
if (in_array($i, $remove)) {
$editeddata=str_replace($lines[$i], "", $data);
$removeline = file_put_contents($myfile, $editeddata.PHP_EOL , FILE_APPEND | LOCK_EX);
}
}
?>
非常感谢!
答案 0 :(得分:3)
您正在读取文件两次(使用file
和file_get_contents
),我认为这会使以后的代码混乱。第一次调用时,您便拥有了所需的一切-文件中所有行的数组。您还使用str_replace
删除内容,如果重复任何内容,这似乎有些危险。
我将其重构为仅根据行号对行数组进行过滤,然后通过一次操作将其写回到文件中:
$myfile = 'txt.txt';
$remove = [1, 3, 5, 7, 10];
// Read file into memory
$lines = file($myfile);
// Filter lines based on line number (+1 because the array is zero-indexed)
$lines = array_filter($lines, function($lineNumber) use ($remove) {
return !in_array($lineNumber + 1, $remove);
}, ARRAY_FILTER_USE_KEY);
// Re-assemble the output (the lines already have a line-break at the end)
$output = implode('', $lines);
// Write back to file
file_put_contents($myfile, $output);
答案 1 :(得分:1)
如果文件适合内存,则可以执行以下简单操作:
$myfile='txt.txt';
$remove=array(1,3,6,7,10);
file_put_contents($myfile, implode(PHP_EOL,array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove)));
注意:因为$remove
是否包含内容或要删除的行有点不确定,所以上面的代码删除了内容。如果要删除行,请将array_diff($file($myfile,FILE_IGNORE_NEW_LINES), $remove)
更改为array_diff_keys($file($myfile,FILE_IGNORE_NEW_LINES), array_flip($remove))
如果文件很大,则需要诉诸某种流传输。我建议不要读取和写入同一文件,并且不要执行以下操作:
$myfile='txt.txt';
$remove=array(1,3,6,7,10);
$h = fopen($myfile,"r");
$tmp = fopen($myfile.".tmp", "w");
while (($line = fgets($h)) !== false) {
if (!in_array(rtrim($line, PHP_EOL), $remove)) {
fwrite($tmp, $line);
}
}
fclose($h);
fclose($tmp);
unlink($myfile);
rename($myfile.".tmp", $myfile);