php读取文本文件并合并重复条目

php读取文本文件并合并重复条目,php,html,arrays,fopen,fwrite,Php,Html,Arrays,Fopen,Fwrite,我刚刚测试了一段代码,如果用户的IP与预定义的IP不匹配,基本上会重定向用户,如果不匹配,则将该IP写入文本文件 $file = fopen("ips.txt", "w"); if ($ip == "iphere") { echo "Welcome"; fclose($file); } else { header('Location: http://www.google.com'); fwrite($file, "\n" . $ip); if ($fil

我刚刚测试了一段代码,如果用户的IP与预定义的IP不匹配,基本上会重定向用户,如果不匹配,则将该IP写入文本文件

$file = fopen("ips.txt", "w");

if ($ip == "iphere") {
    echo "Welcome";
    fclose($file);
} else {
    header('Location: http://www.google.com');
    fwrite($file, "\n" . $ip);
    if ($file) {
        $array = explode("\n", fread($file, filesize("ips.txt")));
    }

    $result = print_r($array, TRUE);

    fclose($file);
}

我想做的是将我正在写入文本文件的IP全部放入一个数组中以查找重复项,记下重复项,过滤掉,然后将它们写回该文件或另一个txt文件,但我被卡住了,不知道从这里走到哪里。

这种方法有几个问题,围绕线程和性能。如果两个人同时点击网页并写入同一个文件,会发生什么情况?此外,此文件可以增长到无限大?这将是缓慢的。您不需要手动检查所有ip,只需检查其中一个

为此,最好使用数据库表。否则,您还需要处理文件锁定

用于功能检查的psuedo代码\u ips:

从ip=?。检查用户id

如果没有结果,请插入ip。这是未知的。(如果需要,还可以向表中添加约束,以防止重复的ip)

否则,ip是已知的


您可以在表中记录计数、日期、上次访问或其他统计信息作为计算摘要。

我建议您使用serialize或json_encode将ip存储在文件中,这样您可以添加更多信息(ip访问次数、上次访问等)

我将向您展示一个简单的示例

1:为测试创建一些虚拟IP

$IPs = array(
'192.168.0.1' => array(
  'visits' => 23,
  'last'   => '2015-07-20'
),
'192.168.0.2' => array(
  'visits' => 32,
  'last'   => '2015-06-23'
)
);
因此,我们在这里创建了一个包含2个IP地址的关联数组,其中还包含访问计数和上次访问

使用php序列化函数或json_encode保存文件(我更喜欢json格式,因为它可以被其他语言使用)

现在是读取文件的时候了

$file = fopen("FILE_NAME", "w");
$file = json_decode($file) // or unserialize($file);
现在我们有了想要使用的数组,我们可以使用php数组函数搜索ip,当然也可以修改ip的相关信息:

if(array_key_exists("YOUR_IP_HERE",$file)){
 //What to do if we have found the ip in the file, for example : 
   $file['YOUR_IP']['visits']++; //we add +1 visit for that ip
}
现在我们可以再次保存文件了

$file = json_encode($file);
file_put_contents("IP_FILE_NAME",$file);

您可以使用数组中的ip轻松地读取文件,然后像下面这样从数组中获取
unique

$ipList = file(ips.txt);

$ipUnique = array_unique($ipList);

然后,您可以为您的porpose保存或解析$ipUnique。

为什么不先检查重复项,然后在文件中没有的情况下写入?strpo或stripo可以处理这个问题。但也有其他方法/功能。如果您更改处理IP地址的方式,则无需担心重复。因此,您只需确保,您没有在文件中写入两次IP吗?我想在文件中写入重复的IP,以查看尝试访问页面的频率,但我不想一直运行查询以查看有多少重复,我希望所有重复的IP与条目旁边的某种标识符相结合,即ip1 X2 ip2 X4。。。等等,你为什么不用数据库呢?简单多了,麻烦少多了。这太棒了,谢谢!这是一个很好的解释。
$ipList = file(ips.txt);

$ipUnique = array_unique($ipList);