$data=<<<EOT
1|127.0.0.1|- LAN|guest|2012-07-10 08:46:05|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-10 08:47:42|http://localhost/test1.html
1|127.0.0.1|- LAN|guest|2012-07-10 08:48:23|http://localhost/test2.html
1|127.0.0.1|- LAN|guest|2012-07-10 08:49:13|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-11 08:50:20|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-11 08:50:51|http://localhost/test3.html
1|127.0.0.1|- LAN|guest|2012-07-11 08:51:07|http://localhost/test3.html
1|127.0.0.1|- LAN|guest|2012-07-11 08:51:37|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-12 08:51:50|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-12 08:52:23|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-12 08:55:00|http://localhost/test4.html
1|127.0.0.1|- LAN|guest|2012-07-12 08:56:10|http://localhost/test4.html
EOT;
$data = preg_split("/[\n\r]/",$data);行格式说明:计数 - IP - IP地址 - 用户名 - 时间 - url这是一个浏览日志文本,现想把这个文本的内容中,同一天、相同url的合并计数,就是把第一个单位累加起来。相同记录合并后的时间为哪一个无所谓。期待结果:
2|127.0.0.1|- LAN|guest|2012-07-10 08:46:05|http://localhost/
1|127.0.0.1|- LAN|guest|2012-07-10 08:47:42|http://localhost/test1.html
1|127.0.0.1|- LAN|guest|2012-07-10 08:48:23|http://localhost/test2.html2|127.0.0.1|- LAN|guest|2012-07-11 08:50:20|http://localhost/
2|127.0.0.1|- LAN|guest|2012-07-11 08:50:51|http://localhost/test3.html2|127.0.0.1|- LAN|guest|2012-07-12 08:51:50|http://localhost/
2|127.0.0.1|- LAN|guest|2012-07-12 08:55:00|http://localhost/test4.html

解决方案 »

  1.   

    foreach($data as $v){
          $t=preg_split("/[| ]+/",$v);
      $k="$t[5]-$t[7]";
      if(!isset($ar[$k])){
           $ar[$k]=$v;
      }else{
            $a=explode('|',$ar[$k],2);
    $a[0]++;
    $ar[$k]=join('|',$a);
      } 
    }
    print_r(array_values($ar));
    Array
    (
        [0] => 2|127.0.0.1|- LAN|guest|2012-07-10 08:46:05|http://localhost/
        [1] => 1|127.0.0.1|- LAN|guest|2012-07-10 08:47:42|http://localhost/test1.html
        [2] => 1|127.0.0.1|- LAN|guest|2012-07-10 08:48:23|http://localhost/test2.html
        [3] => 2|127.0.0.1|- LAN|guest|2012-07-11 08:50:20|http://localhost/
        [4] => 2|127.0.0.1|- LAN|guest|2012-07-11 08:50:51|http://localhost/test3.html
        [5] => 2|127.0.0.1|- LAN|guest|2012-07-12 08:51:50|http://localhost/
        [6] => 2|127.0.0.1|- LAN|guest|2012-07-12 08:55:00|http://localhost/test4.html
    )
      

  2.   

    $data = <<<EOT
    1|127.0.0.1|2012-07-10 08:46:05
    1|127.0.0.1|2012-07-10 08:47:42
    1|127.0.0.1|2012-07-10 08:48:23
    1|127.0.0.1|2012-07-10 08:49:13
    1|127.0.0.1|2012-07-11 08:50:20
    1|127.0.0.1|2012-07-11 08:50:51
    1|127.0.0.1|2012-07-11 08:51:07
    1|127.0.0.1|2012-07-11 08:51:37
    1|127.0.0.1|2012-07-12 08:51:50
    1|127.0.0.1|2012-07-12 08:52:23
    1|127.0.0.1|2012-07-12 08:55:00
    1|127.0.0.1|2012-07-12 08:56:10
    EOT;太强了!就是代码看不大懂,我把数据改简单了下,麻烦你再教一下。只要为同一天的就合并计数,怎么写?
    然后最后不用返回原来的格式,返回数组可供入库就行了。
      

  3.   

    $data = preg_split("/[\n\r]/",$data);
    foreach($data as $v){
          $t=preg_split("/[| ]+/",$v);// print_r($t);
      $k=$t[2];
      if(!isset($ar[$k])){
           $ar[$k]=$v;
      }else{
            $a=explode('|',$ar[$k],2);
    $a[0]++;
    $ar[$k]=join('|',$a);
      } 
    }
    print_r(array_values($ar));
      

  4.   

    日期可否不用空格来分解?换为如:date("Y-m-d",strtotime(datetime));
    因为中间的某些记录有不确定因素,比如IP地址,有的有空格,有的却没有。
      

  5.   


    我的意思是说,以空格分割的话,$t=preg_split("/[| ]+/",$v);
    $k="$t[5]-$t[7]";如果刚好IP中文地址那栏有些是没空格的,或是有二个空格的,那$k就不准确了。
      

  6.   

    明白,那我再试试。还有上次的问题想再完善下,差不多的意思就不再开新帖了。就在这个帖里加分就行了,麻烦再指教一下,谢谢!----------------------------------------------------------- 2
    $data = <<<EOT
    1|50|2012-07-04 14:18:51
    1|75|2012-07-04 14:19:16
    1|80|2012-07-04 14:19:16
    1|48|2012-07-04 14:19:16
    1|61|2012-07-04 14:19:16
    1|50|2012-07-04 14:19:16
    1|75|2012-07-04 14:20:32
    1|80|2012-07-04 14:20:32
    1|48|2012-07-05 14:20:32
    1|61|2012-07-05 14:20:32
    1|50|2012-07-06 14:20:32
    EOT;
    $data = preg_split("/[\n\r]/",$data);
    格式为:数量 ID 日期想把第二个值(ID)相同的、同一天内的合并一下数量。期待结果:
    2|50|2012-07-04 14:18:51
    2|75|2012-07-04 14:19:16
    2|80|2012-07-04 14:19:16
    1|48|2012-07-04 14:19:16
    1|61|2012-07-04 14:19:16
    1|48|2012-07-05 14:20:32
    1|61|2012-07-05 14:20:32
    1|50|2012-07-06 14:20:32
      

  7.   

    将 #3 的代码中的 
    $k=$t[2];
    =》
    $k="$t[1]-$t[2]";