0

我正在做一个小项目。

我想做的是有一个 PHP 文件,根据时间从 .txt 文件中删除行

.txt 文件将像这样格式化

Content | Time (Unix Time)
Content | Time (Unix Time)

每次执行 php 文件时,我希望它删除每一行,即 = 或小于当前时间

我试过使用谷歌,但运气不好,我从一个来源抽出时间。所以这不会是一个问题,只是 PHP 部分。

有片段吗?或者这会很困难。

4

3 回答 3

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 服务器用户或正在执行此脚本的任何用户具有适当的写入权限。

于 2012-08-18T19:18:01.083 回答
1

您可能需要查看fgetcsvfputcsv。您可以使用前者遍历文件中的所有行,过滤掉那些不符合您的条件的行,然后将所有未被过滤器捕获的行放回文件中。

<?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], "|");
    }
}
?>
于 2012-08-18T19:19:30.007 回答
1

为了改进@Michael的答案,不要将所有内容都保存在内存中,而是使用两个文件流并编写从第一个到第二个匹配的行。这将允许您处理任意大的文件。您还可以像大多数应用程序默认情况下那样编写标准输出,并将输出重定向到文件。

$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);
于 2012-08-18T19:22:43.173 回答