php从文本文件中读取并合并重复条目
我有一小段代码我只是测试出来,基本上重定向用户,如果他们的IP不符合预定义的IP,并且它不匹配写入IP成文本文件。php从文本文件中读取并合并重复条目
$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文件,但我卡住了,不知道从哪里走。
我可以建议你使用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 addreses的关联数组,它也包含访问次数和最后一次访问。
使用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);
,现在我们有数组,我们希望使用我们可以发现IP的使用PHP阵列功能,并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);
这是非常好的谢谢! –
这是一个非常好的解释良好的答案。 –
这种方法存在一些问题,围绕线程和性能。如果两个人同时访问网页并写入同一文件,会发生什么情况?此外,这个文件可以增长到一个无限大小?这会很慢。你不需要手动检查所有的ip,只有那个存在。
对此使用数据库表可能会更好。否则,您还需要处理文件锁定。
的功能check_ips伪代码:
SELECT * FROM IPS其中ip =?检查用户号码
如果没有结果,请插入ip。它是未知的。 (也可在需要时您可以添加约束表,以防止重复IP的)
否则,IP被称为
您可以在表中记录数量,日期,最后一次访问,或其他统计数据为计算的概要。
你可以做伊斯利阅读与IP在文件中的数组,从数组中得到unique
值这样
$ipList = file(ips.txt);
$ipUnique = array_unique($ipList);
然后哟可以保存或解析$ ipUnique您porpose。
为什么不先检查重复项,然后写入它,如果它不在文件中? strpos或stripos可以用这个工作。但也有其他方式/功能。 –
如果您更改了处理IP地址的方式,则不必担心重复。 –
所以你只是想确保你不会在文件中写入两次IP? – Rizier123