`

PHP web版各省市 三日内天气预报

阅读更多
<html>
<head>
<title>天气预报模块</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<link href="CSS/style.css" rel="stylesheet">
</head>
<body>
<?php
//载入公共文件
require_once './common.php';

//调用省份,城市和代码的数组表文件
require_once S_ROOT.'./citycode.inc.php';
$country = '';				//初始化变量
$weather = array();			//定义数组

//如果传入城市编码参数,则根据该参数获取指定城市信息
if (isset($_GET['citycode']) && $_GET['citycode']!='' && strlen($_GET['citycode'])<6) {
	$city = getcitybycode($_GET['citycode'],$p,$c,$n);
}elseif(isset($_COOKIE['citycode']) && $_COOKIE['citycode']!='') {
	$city = getcitybycode($_COOKIE['citycode'],$p,$c,$n);
}
unset($country, $p, $c, $n);				//销毁指定的变量


$htmlarr = get_cma_html($city['0']);
if(!is_array($htmlarr) || empty($htmlarr)){
	die('读取中央气象局天气信息失败!');
}

//将读取的数据存储到XML中
$data_dir = DATAPATH.$city[3].'/';
$live_file = $data_dir.'live_'.$city['0'].'.xml';			//将读取的天气信息存储到XML文件中
$cma_file = $data_dir.'cma_'.$city['0'].'.xml';				//将读取的天气指数存储到XML文件中


if (!$cfg['cache']){
    //无缓存,每次更新
    $live_weather = get_live_weather($htmlarr);
    $cma_weather = get_cma_weather($htmlarr);
} else {
	mk_dir($data_dir);	
	if (!@file_exists($live_file)|| date("Ymd")>date("Ymd",filemtime($live_file)) || ($_SGLOBAL['timestamp']-filemtime($live_file))>$cfg['lw_cachetime']) {
		@unlink($live_file);
		//获取实况天气信息,并保存
		$live_weather = get_live_weather($htmlarr);
		save_weather_xml($live_weather, $live_file, 0);
	} else {
		$live_weather = read_weather_xml($live_file, 0);
	}
	if (!@file_exists($cma_file) || date("Ymd")>date("Ymd",filemtime($cma_file)) || ($_SGLOBAL['timestamp']-filemtime($cma_file))>$cfg['w_cachetime']) {
		@unlink($cma_file);
		//获取未来三日天气信息和指数查询,并保存
		$cma_weather = get_cma_weather($htmlarr);
		save_weather_xml($cma_weather, $cma_file, 1);
	} else {
		$cma_weather = read_weather_xml($cma_file, 1);
	}
}
unset($htmlarr);		//销毁指定的变量

foreach ($cma_weather['cma']['gif'] as $k => $v) {			//遍历天气数组元素
	list($gif[$k][0],$gif[$k][1]) = explode(',', $v);
}
?>
<table width="1004" border="0" align="center" cellpadding="0" cellspacing="0">
  <tr>
    <td width="258" height="144" rowspan="3" background="images/index_01.gif">&nbsp;</td>
    <td width="746" height="50" valign="top" background="images/index_02.gif">&nbsp;</td>
  </tr>
  <tr>
    <td width="746" height="34" valign="top" background="images/index_03.gif">&nbsp;</td>
  </tr>
  <tr>
    <td width="746" height="60" valign="top" background="images/index_05.gif">&nbsp;</td>
  </tr>
  <tr>
    <td colspan="2" valign="top">
	<?php 
	define("_TPLPath_", S_ROOT.'./templates/');			//定义模板路径
	include template('weather.htm');					//调用模板文件
	?>
</td>
  </tr>
  <tr>
    <td height="31" colspan="2" background="images/index_19.gif">&nbsp;</td>
  </tr>
</table>
</body>
</html>

 

<?php
if(!defined('IN_WEATHER')) {
	exit('Access Denied');
}

// 通过用户指定的城市编码获取该城市信息,$citycode为城市编码,$p为省份数组,$c为城市数组,$n为城市编码数组
function getcitybycode($citycode,$p,$c,$n){	
	$flag = true;
	foreach($n as $k => $arr){
		if(in_array($citycode,$arr)){
			$pkey = $k;
			$flag = false;
			break;
		}
	}
	if($flag){
		$pkey = '0';
		$ckey = '0';
		$citycode = $n[$pkey][$ckey];
	}else{
		$ckeyarr = array_keys($n[$pkey],$citycode);
		$ckey = $ckeyarr[0];
	}
	$city = array($citycode,$p[$pkey],$c[$pkey][$ckey],$pkey);
	return $city;
}

//通过用户ip得到用户所在位置,然后获取该城市信息,$citycode为城市编码,$p为省份数组,$c为城市数组,$n为城市编码数组
function getcitybyip($country,$p,$c,$n){
	$pkey = getkey($p,$country); //获取省份数组下标
	$ckey = getkey($c[$pkey],$country); //获取城市数组下标
	$code = $n[$pkey][$ckey]; //取得相应省份所属的城市在中央天气预报信息库中的编码
	$city= array($code,$country,$c[$pkey][$ckey],$pkey);
	return $city;
}

function getkey($arr,$country){			//获取数组的下标
	if(is_array($arr)){
		foreach($arr as $key => $val){
			if(preg_match('/('.$val.')/',$country,$match)){
				return $key;
			}
		}
	}else{
		if(preg_match('/('.$arr.')/',$country,$match)){
			return $key;
		}
	}
	return 0;
}

function mk_dir($dir) {				//创建文件夹,@param $dir 文件夹路径
	if(!@file_exists($dir)) {
		@mkdir($dir, 0777);
	}
}

/**
 * 功能: 通过城市编码从中国气象局天气预报页面读取信息
 * 参数: $citycode为城市编码
 * 说明: 返回包含天气信息数组
 */
function get_cma_html($citycode) {
	for ($i=0; $i<10; $i++) {
		//中国气象局天气数据
		if (false != ($htmlarr = file('http://www.cma.gov.cn/tqyb/weatherdetail/'.$citycode.'.html'))) {
			return $htmlarr;
		}
	}
	return false;
}

/**
 * 功能: 从天气数组中提取实况天气信息
 * 参数: $htmlarr为天气信息文本
 * 说明: 返回实况天气信息数组
 */
function get_live_weather($htmlarr) {
	$weather = array();
	$weather['date'] = strip_tags($htmlarr[660]);
	$weather['city'] = strip_tags($htmlarr[670]);
	$weather['weather'] = strip_tags($htmlarr[674]);
	$weather['temperature'] = strip_tags($htmlarr[675]);
	$weather['wind'] = strip_tags($htmlarr[681]);
	$weather['air'] = strip_tags($htmlarr[682]);
	$weather['ultraviolet'] = strip_tags($htmlarr[683]);
	$weather['a'] = strip_tags($htmlarr[684]);
	$weather['gif'] = eregi_replace('(.+)*/tqyb/img/weather/(.+)*" width="20" height="20"></li>', "\\2", $htmlarr[671]);
	return $weather;
}


/**
 * 功能: 从天气数组中提取三日天气信息
 * 参数: $htmlarr为天气信息文本
 * 说明: 返回天气信息数组
 */
function get_cma_weather($htmlarr){
	$waather = array();
	list($dateregine,$weather['city']) = explode("&nbsp;&nbsp;&nbsp;",strip_tags($htmlarr['861']));
	$arr['date'] = array($htmlarr['871'],$htmlarr['872'],$htmlarr['873']);
	$arr['weather'] = array($htmlarr['883'],$htmlarr['890'],$htmlarr['897']);
	$arr['temperature'] = array($htmlarr['917'],$htmlarr['918'],$htmlarr['919']);
	$gif['gif'] = array($htmlarr['882'],$htmlarr['889'],$htmlarr['896']);
	$winddirect = array($htmlarr['925'],$htmlarr['926'],$htmlarr['927']);
	foreach($arr as $k => $v){
		foreach($v as $key => $val){
			$weather['cma'][$k][$key] = strip_tags($val);
		}
	}
	foreach($winddirect as $k => $v){
		$weather['cma']['winddirect'][$k] = htmlspecialchars(eregi_replace('(.+)*"b-cn">(.+)*</td>',"\\2",$v));
	}
	foreach ($gif['gif'] as $k => $v) {
		$weather['cma']['gif'][$k] = eregi_replace('(.+)*/tqyb/img/weather/(.+)*" width="20" height="20">&nbsp;<img src="/tqyb/img/weather/(.+)*" width="20" height="20"></td>',"\\3,\\2",$v);
	}
	return $weather;
}
/**
 * 功能: 从文本中提取指数查询
 * 参数: $htmlarr为天气信息文本
 * 说明: 返回指数查询数组
 */
function get_zscx_weather($htmlarr) {
    $zscx = array('cyzs'=>$htmlarr['974'],'gmzs'=>$htmlarr['978'],'clzs'=>$htmlarr['982'],'jtzs'=>$htmlarr['986'],'zszs'=>$htmlarr['990'],'gyzs'=>$htmlarr['994'],'fszs'=>$htmlarr['998'],'lxzs'=>$htmlarr['1002']);
    foreach ($zscx as $k => $v) {
    	$weather[$k] = eregi_replace('(.+)*title="(.+)*">(.+)*</a></td>',"\\2",$v);
    }
    return $weather;
}

/**
 * 功能: 从指定的路径读取存储有天气信息的xml文件
 * 参数: $filepath为文件路径
 * 说明: 返回天气信息数组
 */
function read_weather_xml($filepath, $mod=0){
	$w = simplexml_load_file($filepath);
	if ($mod == 0) {
	    $weather['city'] = $w->city;
	    $weather['date'] = $w->date;
	    $weather['weather'] = $w->weather;
	    $weather['temperature'] = $w->temperature;
	    $weather['wind'] = $w->wind;
	    $weather['air'] = $w->air;
	    $weather['ultraviolet'] = $w->ultraviolet;
	    $weather['gif'] = $w->gif;
	    foreach ($weather as $k => $v) {
	    	$weather[$k] = iconv("utf-8","gb2312",$v);
	    }
	} elseif ($mod == 1) {
		$weather['city'] = iconv("utf-8","gb2312",$w->city);
		$i = 0;
		foreach ($w->data as $k => $v) {
			foreach ($v as $key => $val) {
				$weather['cma'][$key][$i] = iconv("utf-8","gb2312",$val);
			}
			$i++;
		}
		
		foreach ($w->zscx as $v){
			foreach ($v as $key => $val) {
			    $weather['zscx'][$key] = iconv("utf-8","gb2312",$val);
			}
		}
		
	}
	return $weather;
}

/**
 * 功能: 将天气信息存储为指定的xml文件
 * 参数: $w为该城市天气信息,$filepath为文件路径,$mod=0是表示实况天气信息,$mod=1为未来三日天气信息
 */
function save_weather_xml($w, $filepath, $mod=0){
	$dom = new DomDocument();
	$xmlstr = '<?xml version="1.0" encoding="gb2312"?>';
	$xmlstr .= "<weatherinfo>";
	if ($mod == 1) {
		$xmlstr .= "<city>".$w['city']."</city>";
		$datasize = count($w['cma']['date']);
		for($i=0; $i<$datasize; $i++){
			$xmlstr .= "<data>";
			$xmlstr .="		<date>".$w['cma']['date'][$i]."</date>";
			$xmlstr .="		<weather>".$w['cma']['weather'][$i]."</weather>";
			$xmlstr .="		<temperature>".$w['cma']['temperature'][$i]."</temperature>";
			$xmlstr .="		<winddirect>".$w['cma']['winddirect'][$i]."</winddirect>";
			$xmlstr .="		<gif>".$w['cma']['gif'][$i]."</gif>";
			$xmlstr .="</data>";
		}
	} elseif ($mod == 0) {
		foreach ($w as $k => $v) {
			$xmlstr .= "<".$k.">".$v."</".$k.">";
		}
	}
	$xmlstr .="</weatherinfo>";
	$dom->loadXML($xmlstr);
	$dom->save($filepath);
}

//模板调用
function template($tplfile, $tplpath = '', $tplcachepath = '', $userpack = '', $userpackpath = '') {
	$tplpath = $tplpath != '' ? $tplpath : (defined("_TPLPath_") ? _TPLPath_ : '');
	$tplfile = $tplpath.$tplfile;
	$tplcachelimit = defined("_TPLCacheLimit_") ? _TPLCacheLimit_ : 0;
	$cachefile = ($tplcachepath != '' ? $tplcachepath : (defined("_TPLCachePath_") ? _TPLCachePath_ : '')).str_replace(array('/', '.'), '_', $tplfile.($userpack ? '.'.($userpackpath ? $userpackpath : '').$userpack : '')).'.php';
	$cachetime = @filemtime($cachefile);
	if (@filemtime($tplfile) <= $cachetime && (!$tplcachelimit || time() - $cachetime <= $tplcachelimit)) return $cachefile;
	include S_ROOT.'./libs/nemo.php'; 
	$nemotpl = new nemo;
	$nemotpl->userpack = $userpack ? ($userpackpath ? $userpackpath : $tplpath).$userpack.'.php' : '';
	$nemotpl->template = file_get_contents($tplfile);
	$nemotpl->cachefile = $cachefile;
	$nemotpl->extraparms = ',\\\''.$tplpath.'\\\',\\\''.$tplcachepath.'\\\',\\\''.$userpack.'\\\',\\\''.$userpackpath.'\\\'';
	return $nemotpl->compile();
}
?>

 

  • 大小: 37 KB
1
3
分享到:
评论
1 楼 QQ2457700807 2013-02-28  
 

相关推荐

    php+mysql天气预报

    一个天气预报的PHP代码,定时更新一个天气预报的PHP代码,定时更新一个天气预报的PHP代码,定时更新一个天气预报的PHP代码,定时更新一个天气预报的PHP代码,定时更新一个天气预报的PHP代码,定时更新一个天气预报的...

    php开发微信公众平台有教天气预报开发

    php开发微信公众平台有教天气预报开发

    php天气预报超漂亮.rar

    总之,"php天气预报超漂亮.rar"是一个很好的学习资源,涵盖了PHP Web开发中的多个核心概念,包括API交互、数据解析、前端设计、数据库操作以及基本的安全实践。对于想要提升PHP技能或了解Web开发流程的初学者来说,...

    《php开发典型模块大全》源码之25_天气预报模块

    第25章 天气预报模块 641 25.1 天气预报模块概述 642 25.1.1 天气预报概述 642 ...25.4 查询各城市未来5天的天气预报、指数预报 653 25.5 获取中国气象局未来72小时城市天气预报 655 25.6 程序调试 660

    php天气预报源码

    天气预报,php,代码,简单,直接访问,未来五天的天气预报

    基于PHP的聚合数据天气预报api调用示例.pdf

    三、天气预报API的使用 在使用天气预报API之前,需要申请一个天气预报API的appkey。然后,需要引入封装好的天气调用类,并实例化对象。通过调用不同的方法,可以获取不同的天气信息。 四、天气预报API的字段解释 ...

    免费天气预报 WebService 接口

    ### 免费天气预报 WebService 接口知识点详解 #### 一、概述 本文将详细介绍一个免费提供的天气预报 WebService 接口,该接口由上海思集信息科技有限公司提供。此接口旨在帮助开发者快速集成天气预报功能到自己的...

    天气预报webserver源代码

    《天气预报Web服务器源代码解析》 在信息技术领域,天气预报Web服务器的源代码是用于构建在线天气查询系统的基石。这个系统通常结合了实时数据获取、处理和展示等多个技术环节,为用户提供方便快捷的天气查询服务。...

    php天气预报系统定时生成htm(utf-8版).rar

    标题中的“php天气预报系统定时生成htm(utf-8版).rar”表明这是一个使用PHP语言编写的天气预报系统,它的主要功能是自动生成HTML页面,并且该页面编码为UTF-8,确保能正确显示多语言字符。这个系统设计用于web服务器...

    天气预报WebService实例

    【标题】"天气预报WebService实例"是一个基于网络服务的项目,旨在提供实时的天气信息查询功能。WebService是一种通过互联网交换结构化信息的标准,它允许不同的应用程序之间进行交互,无论它们运行在何种操作系统或...

    天气预报查询webservice课程设计.doc

    本课程设计旨在通过C#与ASP.NET技术,实现一个基于Web Service模式的天气预报查询系统。系统的主要功能包括允许用户选择想要查询天气预报的城市,并返回相应的天气信息。此设计不仅涉及到Web Service的基本原理与...

    天气预报迷你版 v5.0

    天气预报迷你版【说明】 1.这是一个超牛B的自动判断所在城市(区县)的实用天气预报查询系统迷你版。 2.运行环境PHP,本程序适用于实用查询站、网址导航站的副站以及其它任何网站的天气查询网站和天气专业网站。 ...

    php实现天气预报

    在本文中,我们将深入探讨如何使用PHP来实现天气预报功能,并了解相关技术栈与步骤。首先,我们需要明白天气预报服务通常涉及数据获取、处理和展示。对于PHP开发者来说,这通常意味着与API交互,解析返回的数据,...

    天气预报小工具

    Weather Report Online是一款在线实时查询和预报各地天气的小 ... 340 多个中国主要城市和 60 多个国外主要城市三日内的天气预 报数据。中国气象局图例说明: http://www.cma.gov.cn/tqyb /intro/legend.php。

    天气预报插件网站

    - **未来天气预测**:提供短期(如未来三天)和长期(如未来两周)的天气预报。 - **多语言支持**:支持不同国家的语言设置,便于全球用户使用。 - **个性化设置**:允许用户根据个人喜好调整界面显示风格、温度...

    PHP天气预报小偷 v1.0.zip

    PHP天气预报小偷介绍 一些参数在config.php里,请修改下就可以了。 程序可查询一周天气情况。支持搜索,另外有生活指数,疾病指数和休闲指数三个小参数。程序使用的图片已经下载到本地。下次更新将支持伪静态。...

    php自动天气预报程序v1.0

    php自动天气预报程序可以查询涵盖 34 个省、市所属的 2290 个城市、县、地区今天和未来几天的气象趋势预测,主要指标包括每天最高气温、最低气温、天气状况、风向等天气信息 ,非常适合地方网站使用。程序占用资源极...

    discuz天气预报插件

    【标题】:“Discuz天气预报插件” 在网站运营中,Discuz! 是一款非常流行的社区论坛软件,它为用户提供了一个高效、易用的平台来建立和管理在线社区。而“Discuz天气预报插件”是针对这个平台设计的一个实用功能...

Global site tag (gtag.js) - Google Analytics