我用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相同

解决方案 »

  1.   

    步骤简单清晰明了
    情况1:
    记录数据的时候,建议每一条数放到一个容器里面,例如
    【record】记录1【/record】
    【record】记录2【/record】
    ...
    然后再读取文件的时候用preg_match_all分析出每一行记录,接着循环读取每一条记录,用explode根据“,”把记录切割成四个部分(时间、姓名、班级、IP),接着分析姓名,然后找到相同IP所对应的姓名,也就是认识的人情况2:
    ...省略相似步骤...
    按时间从前到后排列每一条记录,分析最前的几条记录的姓名的出现频率,频率高则可能是他本人,至于频率多高才是他本人LZ由你自己设定
      

  2.   

    使用file和explde两个函数就能完成基本操作了:
    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
    )