我用php做了一个在线查询考试成绩的网页,这个程序每完成一次查询就会记录下IP,查询关键字,查询时间等,并保存到文件..文件部分内容如下:
2011-02-02,20:39:42,周卓玉,2011年高三一练,182.114.59.11
2011-02-02,20:40:04,乔元昊,2011年高三一练,182.114.59.11
2011-02-02,20:40:47,张浩杰,2011年高三一练,182.114.59.11
2011-02-02,20:40:50,时茜,2011年高三一练,211.138.16.228
2011-02-02,20:40:57,张琪,2011年高三一练,182.114.59.11
2011-02-02,20:41:24,张琪,2011年高三一练,182.114.59.11
2011-02-02,20:54:57,郭翔,2011年高三一练,211.138.16.227
2011-02-02,20:55:15,王漠,2011年高三一练,211.138.16.228现在我想从这些文件记录中筛选一些有价值的信息,按常理,一个人(IP),一般是先查询自己,再查询熟悉的人,比如那个182.114.59.11就有可能是周卓玉,她认识乔元昊,张浩杰等。还有一种情况:
2011-02-02,21:14:40,祁鹏,2010年高三阶段,211.142.189.235
2011-02-02,21:15:51,祁鹏,2009年高一上期期末,211.142.189.235
2011-02-02,21:16:08,祁鹏,2010年高三竞赛,211.142.189.235
2011-02-02,21:16:35,祁鑫,2010年高三阶段,211.142.189.235
2011-02-02,21:18:40,祁鹏,2011年高三一练,211.142.189.235即一个名字被查询了很多次,那么可能就是他本人
问题是有数万行的查询记录,怎么样才能用程序分析出来呢? 还要考虑的问题是:多人共用一个ip,因为在一起手机上网可能ip相同
2011-02-02,20:39:42,周卓玉,2011年高三一练,182.114.59.11
2011-02-02,20:40:04,乔元昊,2011年高三一练,182.114.59.11
2011-02-02,20:40:47,张浩杰,2011年高三一练,182.114.59.11
2011-02-02,20:40:50,时茜,2011年高三一练,211.138.16.228
2011-02-02,20:40:57,张琪,2011年高三一练,182.114.59.11
2011-02-02,20:41:24,张琪,2011年高三一练,182.114.59.11
2011-02-02,20:54:57,郭翔,2011年高三一练,211.138.16.227
2011-02-02,20:55:15,王漠,2011年高三一练,211.138.16.228现在我想从这些文件记录中筛选一些有价值的信息,按常理,一个人(IP),一般是先查询自己,再查询熟悉的人,比如那个182.114.59.11就有可能是周卓玉,她认识乔元昊,张浩杰等。还有一种情况:
2011-02-02,21:14:40,祁鹏,2010年高三阶段,211.142.189.235
2011-02-02,21:15:51,祁鹏,2009年高一上期期末,211.142.189.235
2011-02-02,21:16:08,祁鹏,2010年高三竞赛,211.142.189.235
2011-02-02,21:16:35,祁鑫,2010年高三阶段,211.142.189.235
2011-02-02,21:18:40,祁鹏,2011年高三一练,211.142.189.235即一个名字被查询了很多次,那么可能就是他本人
问题是有数万行的查询记录,怎么样才能用程序分析出来呢? 还要考虑的问题是:多人共用一个ip,因为在一起手机上网可能ip相同
情况1:
记录数据的时候,建议每一条数放到一个容器里面,例如
【record】记录1【/record】
【record】记录2【/record】
...
然后再读取文件的时候用preg_match_all分析出每一行记录,接着循环读取每一条记录,用explode根据“,”把记录切割成四个部分(时间、姓名、班级、IP),接着分析姓名,然后找到相同IP所对应的姓名,也就是认识的人情况2:
...省略相似步骤...
按时间从前到后排列每一条记录,分析最前的几条记录的姓名的出现频率,频率高则可能是他本人,至于频率多高才是他本人LZ由你自己设定
file
(PHP 4, PHP 5)file — 把整个文件读入一个数组中说明
array file ( string $filename [, int $use_include_path [, resource $context ]] )
和 file_get_contents() 一样,只除了 file() 将文件作为一个数组返回。数组中的每个单元都是文件中相应的一行,包括换行符在内。如果失败 file() 返回 FALSE。 如果也想在 include_path 中搜寻文件的话,可以将可选参数 use_include_path 设为 "1"。
<?php
// 将一个文件读入数组。本例中通过 HTTP 从 URL 中取得 HTML 源文件。
$lines = file('http://www.example.com/');
// 在数组中循环,显示 HTML 的源文件并加上行号。
foreach ($lines as $line_num => $line) {
echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
// 另一个例子将 web 页面读入字符串。参见 file_get_contents()。
$html = implode('', file ('http://www.example.com/'));
?>
========================================================================================explode
(PHP 4, PHP 5)explode — 使用一个字符串分割另一个字符串说明
array explode ( string $separator , string $string [, int $limit ] )
此函数返回由字符串组成的数组,每个元素都是 string 的一个子串,它们被字符串 separator 作为边界点分割出来。如果设置了 limit 参数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。 如果 separator 为空字符串(""),explode() 将返回 FALSE。如果 separator 所包含的值在 string 中找不到,那么 explode() 将返回包含 string 单个元素的数组。 如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。此特性是 PHP 5.1.0 中新增的。 由于历史原因,虽然 implode() 可以接收两种参数顺序,但是 explode() 不行。你必须保证 separator 参数在 string 参数之前才行。 Note: 参数 limit 是在 PHP 4.0.1 中加入的。 Example #1 explode() 例子<?php
// 示例 1
$pizza = "piece1 piece2 piece3 piece4 piece5 piece6";
$pieces = explode(" ", $pizza);
echo $pieces[0]; // piece1
echo $pieces[1]; // piece2// 示例 2
$data = "foo:*:1023:1000::/home/foo:/bin/sh";
list($user, $pass, $uid, $gid, $gecos, $home, $shell) = explode(":", $data);
echo $user; // foo
echo $pass; // *?>
Example #2 limit 参数例子<?php
$str = 'one|two|three|four';// 正数的 limit
print_r(explode('|', $str, 2));// 负数的 limit(自 PHP 5.1 起)
print_r(explode('|', $str, -1));
?>
以上例程会输出:Array
(
[0] => one
[1] => two|three|four
)
Array
(
[0] => one
[1] => two
[2] => three
)