$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
$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
)
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;太强了!就是代码看不大懂,我把数据改简单了下,麻烦你再教一下。只要为同一天的就合并计数,怎么写?
然后最后不用返回原来的格式,返回数组可供入库就行了。
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));
因为中间的某些记录有不确定因素,比如IP地址,有的有空格,有的却没有。
我的意思是说,以空格分割的话,$t=preg_split("/[| ]+/",$v);
$k="$t[5]-$t[7]";如果刚好IP中文地址那栏有些是没空格的,或是有二个空格的,那$k就不准确了。
$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
$k=$t[2];
=》
$k="$t[1]-$t[2]";