我正在做一个小项目。
我想做的是有一个 PHP 文件,根据时间从 .txt 文件中删除行
.txt 文件将像这样格式化
Content | Time (Unix Time)
Content | Time (Unix Time)
每次执行 php 文件时,我希望它删除每一行,即 = 或小于当前时间
我试过使用谷歌,但运气不好,我从一个来源抽出时间。所以这不会是一个问题,只是 PHP 部分。
有片段吗?或者这会很困难。
我正在做一个小项目。
我想做的是有一个 PHP 文件,根据时间从 .txt 文件中删除行
.txt 文件将像这样格式化
Content | Time (Unix Time)
Content | Time (Unix Time)
每次执行 php 文件时,我希望它删除每一行,即 = 或小于当前时间
我试过使用谷歌,但运气不好,我从一个来源抽出时间。所以这不会是一个问题,只是 PHP 部分。
有片段吗?或者这会很困难。
有很多方法可以处理这个...实际上很容易,除非你的文件真的很大。这种方法不是最节省内存的,但它可能是最简单的。
将文件读入带有 的行数组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 服务器用户或正在执行此脚本的任何用户具有适当的写入权限。
您可能需要查看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], "|");
}
}
?>
为了改进@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);