本节内容:
查找数组中某个元素
在php编程中,查找一个元素是否在数组中,可以有三种做法:
in_array '函数在数组中搜索给定的值。in_array(value,array,type)type 可选。
如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。
array_key_exists 'array_key_exists() 函数
判断某个数组中是否存在指定的 key,如果该 key 存在,则返回 true,否则返回 false。
array_search 'array_search() 函数
与 in_array() 一样,在数组中查找一个键值。如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。
说明:
在数据量不大时,比如小于1000,查找用哪一种都行,都不会成为瓶颈;
当数据量比较大时,用array_key_exists比较合适。
当然这里array_key_exists占用的内存比较大,经测算,数组结构是:
内存使用比值为1:2;
这个和内部实现有关系,实际上在php中第一种和第二种的数据结构类似,都是关联数组。
本节内容:
抓取google关键词排名
实现思路:
使用PHP的curl函数储存cookie,google搜索页面是无法用file_get_connents打开的,必须要完全模拟浏览器才行。
百度则可以直接用file_get_conntens抓取页面,然后用正则处理下即可。
例子:
<?php
header("Content-Type: text/html;charset=utf-8");
function ggsearch($url_s, $keyword, $page = 1) {
$enKeyword = urlencode($keyword);
$rsState = false;
$page_num = ($page -1) * 10;
if ($page <= 10) {
$interface = "eth0:" . rand(1, 4); //避免GG封IP
$cookie_file = dirname(__FILE__) . "/temp/google.txt"; //存储cookie值
$url = "http://www.google.com/search?q=$enKeyword&hl=en&prmd=imvns&ei=JPnJTvLFI8HlggeXwbRl&start=$page_num&sa=N";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
//curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);//获取浏览器类型
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5");
curl_setopt($ch, CURLOPT_INTERFACE, "$interface"); //指定访问IP地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
$contents = curl_exec($ch);
curl_close($ch);
$match = "!<div\s*id=\"search\">(.*)</div>\s+<\!--z-->!";
preg_match_all("$match", "$contents", $line);
while (list ($k, $v) = each($line[0])) {
preg_match_all("!<h3\s+r\"><a[^>]+>(.*?)</a>!", $v, $title);
$num = count($title[1]);
for ($i = 0; $i < $num; $i++) {
if (strstr($title[0][$i], $url_s)) {
$rsState = true;
$j = $i +1;
$sum = $j + (($page) * 10 - 10);
//echo $contents;
echo "关键字" . $keyword . "<br>" . "排名:" . '<font color="red" size="20" >' . $sum . '</font>' . "####" . "第" . '<font color="#00FFFF" size="18" >'.$page . '</font>'. " 页" . "第" .'<font color="#8000FF" size="15" >'.$j . '</font>'. "名" . $title[0][$i] . "<br>";
echo "<a href='" . $url . "'>" . "点击搜索结果" . "</a>" . "<br>";
echo "<hr>";
break;
}
}
}
unset ($contents);
if ($rsState === false) {
ggsearch($url_s, $keyword, ++ $page); //找不到搜索页面的继续往下搜索
}
} else {
echo '关键字' . $keyword . '10页之内没有该网站排名' . '<br>';
echo "<hr>";
}
}
if (!empty ($_POST['submit'])) {
$time = explode()(' ', microtime());
$start = $time[0] + $time[1];
$more_key = trim($_POST['textarea']);
$url_s = trim($_POST['url']);
if (!empty ($more_key) && !empty ($url_s)) {
/*判断输入字符的规律*/
if (strstr($more_key, "\n")) {
$exkey = explode("\n", $more_key);
}
if(strstr($more_key, "|")) {
$exkey = explode("|", $more_key);
}
if(!strstr($more_key, "\n")&&!strstr($more_key, "|")){
$exkey=array($more_key);
}
/*判断是否有www或者http://之类的东西*/
if (count(explode('.', $url_s)) <= 2) {
$url = ltrim($url_s, 'http://www');
$url = 'www.' . $url_s;
}
foreach ($exkey as $keyword) {
//$keyword;
ggsearch($url_s, $keyword);
}
$endtime = explode(' ', microtime());
$end = $endtime[0] + $endtime[1];
echo '<hr>';
echo '程序运行时间: ';
echo $end - $start;
//die();
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>抓取排名 - www.</title>
</head>
<body>
<form action="" method="post">
<span>关键字:</span> <textarea name="textarea" rows="20" cols="40" wrap="off">
格式例如:keyword1|keyword2|keyword3
或者: keyword1
keyword2
keyword3
</textarea>
<span>url地址:</span><input type="text" name="url">
<input type="submit" name="submit" value="搜索">
</form>
</body>
</html>
本节内容:
按日、周、月点击排行统计
原理分析:
首先,判断当前文章的日期是否为当月当日当周的,是的话,则点击数加1。
例子:
/**
* 按日、周、月点击排行统计
* by www.
*/
$now=time(); //当前时间
$StrUpdate = "Update $tbl_article set hits=hits+1";
if(date("d",$lasthittime)==date("d",$now)){//同一天
$StrUpdate = $StrUpdate.",dayhits = dayhits+1";
}else{
$StrUpdate = $StrUpdate.",dayhits = 0";
}
if(date("W",$lasthittime)==date("W",$now)){//同一周
$StrUpdate = $StrUpdate.",weekhits = weekhits+1";
}else{
$StrUpdate = $StrUpdate.",weekhits = 0";
}
if(date("m",$lasthittime)==date("m",$now)){//同一月
$StrUpdate = $StrUpdate.",monthhits = monthhits+1";
}else{
$StrUpdate = $StrUpdate.",monthhits = 0";
}
$StrUpdate = $StrUpdate.",lasthittime='$now' where id='$id'"; //更新点击时间
$fsql->query($StrUpdate);
小问题:
如果是天的话,则要先判断年月都是一样的,然后再判断天。