代码仅保存循环的最后一个条目

时间:2015-01-27 04:03:23

标签: php

我想通过将结果写入第二个文本文件来过滤一个文本文件。

我有一些代码,它不起作用,它只是将第一个文本文件的LAST行写入单独的备份文本文件。

代码:

//filter the ingame bans
$search = "permanently"; 
$logfile = "ban_list.txt";
$timestamp = time();

// Read from file 
$file = fopen($logfile, "r");
while( ($line =  fgets($file) )!= false)
{
    if(stristr($line,$search))
    {
        $cache_ig = "ingamebanlist.txt";
        $fh = fopen($cache_ig, 'w') or die("can't open file");
        $content = "\n";
        fwrite($fh, $content);
        $content = $line;
        fwrite($fh, $content);
        fclose($fh);    
    }
}

我个人认为我的代码中没有任何错误,请帮忙。

记住:它确实有用,但它只将ban_list.txt文件的最后一行写入ingamebanlist.txt文件......

1 个答案:

答案 0 :(得分:1)

你的代码会发生的事情是你打开(使用写模式),在你的循环中写入和关闭所以它只会写入1个条目然后覆盖它直到最后一个条目,因此只保存最后一个项目。

你想要的是将它放在循环之外:

<?php
$search = "permanently"; 
$logfile = "ban_list.txt";
$cache_ig = "ingamebanlist.txt";
$timestamp = time();

$read = fopen($logfile, "r") or die("can't read file");
$write = fopen($cache_ig, 'w') or die("can't write to file");
while(($line = fgets($read)) !== false)
{
    if(stristr($line,$search))
    {
        fwrite($write, $line . "\n");
    }
}
fclose($write);
fclose($read);

另一种解决方案是a使用w代替fopen w,因为a将:

  

仅供写作;将文件指针放在文件的开头,并将文件截断为零长度。如果该文件不存在,请尝试创建它。

虽然$fh = fopen($cache_ig, 'w') or die("can't open file"); 会:

  

仅供写作;将文件指针放在文件的末尾。如果该文件不存在,请尝试创建它。

这将允许您的代码按原样工作而不做任何更改,但行:

$fh = fopen($cache_ig, 'a') or die("can't open file");

要:

{{1}}