我正在开展一个小项目。
我想做的是,有一个PHP文件,根据时间从.txt文件中删除行
.txt文件的格式如下
Content | Time (Unix Time)
Content | Time (Unix Time)
每次执行php文件时,我希望它删除每行=或小于当前时间
我尝试使用谷歌,并且没有运气,我从一个来源拉动时间。所以这不会成为问题,只需PHP部分。
有片段吗?或者这会很困难。
答案 0 :(得分:2)
有很多方法可以解决这个问题......除非您的文件非常大,否则实际上很容易。这种方法不是最有效的内存,但它可能是最简单的。
将文件读入包含file()
的行数组,循环遍历它们并在|
上分别展开。如果时间戳比当前时间更新,则将该行添加到输出数组。
最后,使用输出数组的值写回文件:
$output = array();
// Read the file into an array of lines:
$lines = file('yourfile.txt');
// Store the current time
$now = time();
foreach ($lines as $line) {
// Split on |
list($content, $time) = explode("|", $line);
if ($time > $now) {
// Keep the line in the output array:
$output[] = $line;
}
// Otherwise do nothing with it
}
// Implode it back to a string and write to file:
$outstring = implode("\n", $output);
file_put_contents("yourfile.txt", $outstring);
确保yourfile.txt
具有对您的Web服务器用户或执行此脚本的任何用户的相应写入权限。
答案 1 :(得分:1)
您可能需要查看fgetcsv
和fputcsv
。您可以使用前者循环浏览文件中的所有行,过滤掉不符合条件的行,并将所有未被过滤器捕获的行放回文件中。
<?php
$filtered = array();
if($handle = fopen("data.txt", "r")){
while($data = fgetcsv($handle, 0, "|")){
if($data[1] > time()){
$filtered[] = $data;
}
}
fclose($handle);
}
if($handle = fopen("data.txt", "w")){
for($i = 0; $i < count($filtered); $i += 1){
fputcsv($handle, $filtered[$i], "|");
}
}
?>
答案 2 :(得分:1)
要改进@ Michael的答案,而不是将所有内容保存在内存中,请使用两个文件流并编写从第一个到第二个匹配的行。这将允许您处理任意大文件。您也可以编写stdout,因为大多数应用程序默认执行,并将输出重定向到文件。
$input = fopen("file.txt", "rb");
$output = fopen("output.txt", "wb");
$now = time();
while ($row = fgets($input))
{
list($content, $time) = explode("|", $row);
if ($time > $now)
{
// change to echo to write to stdout
fwrite($output, $row);
}
}
fclose($input);
fclose($output);