前几天发布了月薪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函数在这里起到了很好的作用,在文件指针中读取一行,然后进行匹配记录,起到了很高的效率,当然还有很多高手利用自己的思维方式以更高的效率来完成统计,如果您有的好的方式的话请留言,谢谢!