php从文本文件中读取并组合重复的条目

时间:2015-07-21 14:57:45

标签: php html arrays fopen fwrite

我有一小段代码,我只是测试一下,如果用户的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文件,但我被困住了,不知道从哪里开始。

3 个答案:

答案 0 :(得分:0)

这种方法存在一些问题,包括线程和性能。如果两个人同时点击网页并写入同一个文件会怎样?此外,这个文件可以增长到无限大小?这将是缓慢的。你不需要手动检查所有的ip,只有那个存在。

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

函数check_ips的psuedo代码:

从ips中选择*,其中ip =?。检查用户ID

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

否则,ip已知

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

答案 1 :(得分:0)

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

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

1:创建一些虚拟ips进行测试。

$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 serialize函数或json_encode保存文件(我更喜欢json格式,因为它可以被其他语言使用)。

$for_save = json_encode($IPs); // OR serialize($IPs)
file_put_contents("FILE_NAME",$for_save); //Save the file with the IP's

现在是时候阅读文件了

$file = fopen("FILE_NAME", "w");
$file = json_decode($file) // or unserialize($file);

现在我们可以根据需要使用数组,我们可以使用php数组函数搜索ip,并且offcourse修改有关ips的信息:

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);

答案 2 :(得分:0)

您可以使用数组中的ip轻松读取文件,并从数组中获取unique

$ipList = file(ips.txt);

$ipUnique = array_unique($ipList);

然后哟可以保存或解析你的porpose的$ ipUnique。