0

私は小さなプロジェクトに取り組んでいます。

私がやろうとしているのは、PHPファイルを用意し、時間に基づいて.txtファイルから行を削除することです

.txt ファイルは次のようにフォーマットされます

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

PHPファイルが実行されるたびに、現在の時間以下のすべての行を削除したい

私はグーグルを使ってみましたが、うまくいきませんでした.1つの情報源から時間を引っ張っています. それは問題になりません。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.txtWebサーバーユーザー、またはこのスクリプトを実行しているユーザーに適切な書き込み権限があることを確認してください。

于 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の答えを改善するには、すべてをメモリに保持する代わりに、2つのファイルストリームを使用して、最初から2番目に一致する行を書き込みます。これにより、任意に大きなファイルを処理できるようになります。ほとんどのアプリケーションがデフォルトで行うように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);
于 2012-08-18T19:22:43.173 に答える