$ips = file_get_contents($_SERVER['DOCUMENT_ROOT']."/visitors.txt");
$arr = explode(",",$ips);
$today = strtotime(date('Y-m-d H:i:s'));
for ($n = 0, $max = count($arr); $n <= $max; $n++) {
$visArr = explode("#",$arr[$n]);
$visDate = strtotime($visArr[1]); //$visArr[1] = 2011-12-27 14:10:45
if($visDate < $today){
unset ($arr[$n]);
}
}
print_r($arr); //empty array!
数据存储方式
xxx.xxx.xxx.xxx#2011-12-27 11:56:24,
xxx.xxx.xxx.xxx#2011-12-28 11:56:24,
当我比较访问者日期时,结果是不正确的,我可以知道它有什么问题吗?
编辑:我修复了我的代码,当比较两个日期时仍然给出一个空数组!!任何建议? ?
它有很多错误,但这里是最明显的:
-
$arr
被,'r'n
爆炸意味着逗号将不再在任何结果数组元素中,因为分隔符被丢弃(除非有更多的数据比你原来发布的)。 - 你实际上并没有在第一个
foreach
循环中使用$key
,所以你应该省略它。 -
$arrr
在第一个循环中不断被覆盖,这意味着当循环完成时,它将只包含$arr
的最后一个元素的逗号分隔的数据。因为前面对explode()
的调用删除了末尾的逗号,所以此时这可能是一个什么都没有的数组。 -
在第二个循环条件下使用
count()
函数。计数不会改变,所以你应该把它放在循环本身之前,或者像这样放在第一部分:for ($n = 0, $max = count($arrr); $n <= $max; $n++) {
-
您在第二个循环中使用
<=
,因此您正在进行额外的不必要的迭代。包含n
个元素的数组的最大索引是n - 1
。在这种情况下,您应该使用<
,因为$arrr[count($arrr)]
没有定义。
先去掉逗号,然后strtotime
<>之前
$visDate = strtotime(trim($visArr[1], ","));
Ummm....
$today = strtotime(date("Y-m-d H:i:s"));
你让PHP生成一个时间戳,格式化为字符串,然后解析回时间戳…为什么不直接使用
$today = time();
首先按照这里的建议你必须做:
$today = time();
以秒为单位获取当前时间。
由于这个错误的比较,你最终得到一个空数组:
if($visDate < $today)
这个条件将总是返回true,因为$today
变量包含当前时间,并且您的访问者日志文件有历史访问者记录,显然小于当前时间戳。
如果你只想让你的最终数组只显示最近24小时的访问者,那么你的条件应该是:
if(($today-$visDate) > 86400)
84600是一天的秒数