php技术博客
让天下没有搞不定的bug~

关注:4k的php程序题公布答案了

 

         前几天发布了月薪2k的php程序题,查看原文问题请点击:原文试题 现在把答案贴在这里,你们答对了吗?

方法一:

<?php

$log = ‘test.log’;

$baiduspider = array();

$baidu_preg = ‘/\[(.+?)\s\+\d+/’;

$fp = fopen($log, “r+”);

while (($line = fgets($fp)) !== false)

{

if (strpos($line, ‘Baiduspider’) !== false)

{

preg_match($baidu_preg, $line, $matches);

$hour = intval(substr($matches[1], -8, -6));

$baiduspider[$hour]++;

}

}

foreach ($baiduspider as $k => $v)

{

echo $k, ‘点:’, $v, ‘次’;

echo “\n”;

}

?>

方法二:

 

$file_handle = fopen(“test.log”,”r”);

//先读取每行,把404和Baiduspider进行筛选出来放入两个字符串内

$aArr = ”;

$bArr = ”;

while (!feof($file_handle)) {

$str2 = fgets($file_handle);

if (preg_match(“/404/”,$str2,$result)){

$aArr .= $str2;

}

else if(preg_match(“/Baiduspider/”,$str2,$result)){

$bArr .= $str2;

}

}

//然后对分离出来的两个新的字符串进行匹配时间,进行统计

//404各个时段出现的次数

preg_match_all(“/\d{4}:\d{2}:\d{2}:\d{2}/”, $aArr, $newArr);

$sum = array();

foreach($newArr as $arr){

if(!empty($arr)){

foreach($arr as $key => $value){

$dateArr = explode(‘:’,$value);

$sum[$key] = $dateArr[‘1’];

}

}

}

$rs0 = array_count_values($sum);

echo ‘404各个时段出现的次数:’;

echo “<br/>”;

foreach($rs0 as $key => $val){

echo $key.’时:’.$val.'<br/>’;

}

//百度蜘蛛来过的各个时段出现的次数

preg_match_all(“/\d{4}:\d{2}:\d{2}:\d{2}/”, $bArr, $newArr);

$sum = array();

foreach($newArr as $arr){

if(!empty($arr)){

foreach($arr as $key => $value){

$dateArr = explode(‘:’,$value);

$sum[$key] = $dateArr[‘1’];

}

}

}

$rs0 = array_count_values($sum);

echo ‘百度蜘蛛来过的各个时段出现的次数:’;

echo “<br/>”;

foreach($rs0 as $key => $val){

echo $key.’时:’.$val.'<br/>’;

}

 

      请看清题目: 统计输出 每个小时内百度蜘蛛来过的次数,不难看出第二种方法写的有点罗嗦,第二种方法代码可以进行封装起来达到二次利用,两个循环效率不高,还是第一种方法效率高,fgets函数在这里起到了很好的作用,在文件指针中读取一行,然后进行匹配记录,起到了很高的效率,当然还有很多高手利用自己的思维方式以更高的效率来完成统计,如果您有的好的方式的话请留言,谢谢!

赞(0)
未经允许不得转载:PHP技术博客 » 关注:4k的php程序题公布答案了

评论 1

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    真不知道这是在干嘛。。。 :mrgreen:

    mark10年前 (2012-02-24)回复