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文件,但我卡住了,不知道从哪里走。

+0

为什么不先检查重复项,然后写入它,如果它不在文件中? strpos或stripos可以用这个工作。但也有其他方式/功能。 –

+0

如果您更改了处理IP地址的方式,则不必担心重复。 –

+0

所以你只是想确保你不会在文件中写入两次IP? – Rizier123

我可以建议你使用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); 
+0

这是非常好的谢谢! –

+0

这是一个非常好的解释良好的答案。 –

这种方法存在一些问题,围绕线程和性能。如果两个人同时访问网页并写入同一文件,会发生什么情况?此外,这个文件可以增长到一个无限大小?这会很慢。你不需要手动检查所有的ip,只有那个存在。

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

的功能check_ips伪代码:

SELECT * FROM IPS其中ip =?检查用户号码

如果没有结果,请插入ip。它是未知的。 (也可在需要时您可以添加约束表,以防止重复IP的)

否则,IP被称为

您可以在表中记录数量,日期,最后一次访问,或其他统计数据为计算的概要。

你可以做伊斯利阅读与IP在文件中的数组,从数组中得到unique值这样

$ipList = file(ips.txt); 

$ipUnique = array_unique($ipList); 

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