2007-01-07 01:08
<?php
//[作者:龙龙,发表时间:2006-11-15,未经同意不得转载] //本算法实现公交线路一次换乘,多次 换乘算法这里不作讨论 //数据库名bus,建立数据表bus //由于此 换乘算法比较简单,只需一张表bus就可以了 //表bus结构如: /** * ********************************************************************************************** * id(自动编号 pk) busline(公交线路 int 4) busname(站点名称 varchar 20) busorder(站点顺序 int 4) * 1 1 火车站 1 * 2 1 胜利广场 2 * 3 1 卖渔桥 3 * ... ... ... ... * 25 2 胜利广场 1 * 26 2 天香电器城 2 * 27 2 五里墩 3 * ... ... ... ... * 数据库就是这样插记录的,可以把城市的公交线路数据全部插进去 ************************************************************************************************ */ //定义一个新类 //实现公交换乘 class buss{ //定义数据库连接成员变量 var $host; var $user; var $passwd; var $database; var $conn; //利用构造函数实现变量初始化,连接数据库 function buss(){ $this->host="localhost"; $this->user="root"; $this->passwd=""; $this->database="bus"; $this->conn=mysql_connect($this->host, $this->user,$this->passwd) or die("Could not connect to $this->host"); mysql_select_db($this->database,$this->conn) or die("Could not switch to database $this->database"); } //统计数据库中所有公交站点名,存入数组 //返回站点名 function busstotal(){ $SQL = "select * from bus group by busname"; $count = 0; $result = mysql_query($SQL); while($row = mysql_fetch_object($result)){ $bustotal[$count]= $row->busname; $count++; } return $bustotal; } //统计数据库中所有公交路线,存入数组 //返回公交线路 function busslinetotal(){ $SQL = "select * from bus group by busline"; $count = 0; $result = mysql_query($SQL); while($row = mysql_fetch_object($result)){ $buslinetotal[$count]= $row->busline; $count++; } return $buslinetotal; } //统计数据库中每一线路经过的站点,存入数组 //需要参数line,区别每一路车 //返回站点名 function bussperline($line){ $SQL = "select * from bus where busline = '$line'"; $count = 0; $result = mysql_query($SQL); while($row = mysql_fetch_object($result)){ $busperline[$count]= $row->busname; $count++; } return $busperline; } //统计经过某站点的所有公交车的组合 //需要参数station,表示经过的站点 //返回公交线路 function passline($station){ $SQL = "select * from bus where busname = '$station' group by busline"; $count = 0; $result = mysql_query($SQL); while($row = mysql_fetch_object($result)){ $passline[$count]= $row->busline; $count++; } return $passline; } //实现 换乘算法的函数 //需要提供参数,查询的起点和终点 function bussStationToStation($start,$end){ $flag1 = false; $flag2 = false; //函数回调 $busstotal = $this->busstotal(); $busslinetotal = $this->busslinetotal(); //判断数据库中是否有此站点 for($i=0;$i<count($busstotal);$i++){ if($start==$busstotal[$i]) $flag1 = true; if($end==$busstotal[$i]) $flag2 = true; if($flag1 and $flag2) break; } //有一个站点不存在 if(!($flag1 and $flag2)){ if(!$flag1) die("$start站点不存在!"); if(!$flag2) die("$end站点不存在!"); } //两个站点都存在的情况 //首先判断有无直达车 $strTemp = ""; //遍历所有车次 for($i=0;$i<count($busslinetotal);$i++){ $flag3 = 0; //函数回调 $bussperline = $this->bussperline($busslinetotal[$i]); //遍历每一车次经过的站点 for($j=0;$j<count($bussperline);$j++){ if($start==$bussperline[$j]) $flag3 +=1; if($end==$bussperline[$j]) $flag3 +=1; if($flag3==2) break; } if($flag3==2) //保存直达车次,以||分割 $strTemp = $strTemp.$busslinetotal[$i]."||"; } if($strTemp==""){ //没有直达车,则计算一次换乘情况 echo("<strong><font color=#FF0000>".$start. "</font></strong> 到 <strong><font color=#FF0000>" .$end."</font></strong> 没有直达车!请参照下列换乘建议. "); //查询一级中转站 //start起点 //end终点 //函数回调,取得经过起点和终点的所有组合 $statpass = $this->passline($start); $endpass = $this->passline($end); //得到经过起点和终点的线路的全部组合 $resultbus = ""; for($a=0;$a<count($statpass);$a++){ for($b=0;$b<count($endpass);$b++){ //判断两条线路有没有交叉点 $startper = $this->bussperline($statpass[$a]); $endper = $this->bussperline($endpass[$b]); for($c=0;$c<count($startper);$c++){ for($d=0;$d<count($endper);$d++){ if($startper[$c]==$endper[$d]){ //成功找到交叉点后 //存储交叉点处信息 //此只为一次换乘 $fistid = $statpass[$a]; $secondid = $endpass[$b]; $changestation = $startper[$c]; $resultbus .= $fistid.";".$secondid.";".$changestation."||"; } } } } } if($resultbus=="") { //没有找到换乘线路 echo(" 抱歉,<strong><font color=#FF0000>" .$start. "</font></strong> 到 <strong><font color=#FF0000>" .$end. "</font></strong>没有直达车,换乘一次也无法到达!"); } else{ //找到换乘线路 $resultbus = substr($resultbus,0,strlen($resultbus)-2);//去掉最右边的"||" $resultbus_ok1 = explode("||",$resultbus);//将字符串分割成数组 echo ("<table width=600 border=0 bgcolor=#003399 cellpadding=3 cellspacing=1>"); echo ("<tr bgcolor=#FDDD90>"); echo ("<td width=150><strong>起点</strong></td>"); echo ("<td width=70><strong>车次</strong></td>"); echo ("<td width=160><strong>中转站</strong></td>"); echo ("<td width=70><strong>车次</strong></td>"); echo ("<td width=150><strong>终点</strong></td>"); echo ("</tr>"); for($mm=0;$mm<count($resultbus_ok1);$mm++){ $resultbus_ok2 = explode(";",$resultbus_ok1[$mm]); //计算两辆车的起点和终点 $bus1 = $this->bussperline($resultbus_ok2[0]); $bus2 = $this->bussperline($resultbus_ok2[1]); //显示 echo ("<tr bgcolor=#E8F3FF onMouseOver = this.style.backgroundColor = '#FFF9EE' onMouseOut = this.style.backgroundColor = ''>"); echo ("<td width=150><strong><font color=#FF0000>" .$bus1[0]. "</strong></font></td>"); echo ("<td width=70><a href=''>" .$resultbus_ok2[0]. "</a></td>"); echo ("<td width=160><strong><font color=#FF0000>" .$resultbus_ok2[2]. "</strong></font> ==> </td>"); echo ("<td width=70><a href=''>" .$resultbus_ok2[1]. "</a></td>"); echo ("<td width=150><strong><font color=#FF0000>" .$bus2[count($bus2)-1]. "</strong></font></td>"); echo("</tr>"); } echo("</table>"); } } else{ //有直达车,直接显示直达车情况 echo ("<table width=600 border=0 bgcolor=#003399 cellpadding=3 cellspacing=1>"); echo ("<tr bgcolor=#FDDD90>"); echo ("<td width=150><strong>车次</strong></td>"); echo ("<td width=70><strong>起点</strong></td>"); echo ("<td width=160><strong>经过</strong></td>"); echo ("<td width=70><strong>经过</strong></td>"); echo ("<td width=150><strong>终点</strong></td>"); echo ("<td width=150><strong>详情</strong></td>"); echo ("</tr>"); $strTemp = substr($strTemp,0,strlen($strTemp)-2);//去掉最右边的"||" $strTemp_ok1 = explode("||",$strTemp);//将字符串分割成数组 for($nn=0;$nn<count($strTemp_ok1);$nn++){ //计算车辆的起点和终点 $bus = $this->bussperline($strTemp_ok1[$nn]); //显示 echo ("<tr bgcolor=#E8F3FF onMouseOver = this.style.backgroundColor = '#FFF9EE' onMouseOut = this.style.backgroundColor = ''>"); echo ("<td width=150><font color=#FF0000>" .$strTemp_ok1[$nn]. "</strong></font></td>"); echo ("<td width=70><a href=''>" .$bus[0]. "</a></td>"); echo ("<td width=160><strong><font color=#FF0000>" .$start. "</strong></font> ==> </td>"); echo ("<td width=70><a href=''>" .$end. "</a></td>"); echo ("<td width=150><font color=#FF0000>" .$bus[count($bus)-1]. "</strong></font></td>"); echo ("<td width=70><a href=''>详情</a></td>"); echo("</tr>"); } echo("</table>"); } } } /* 定义好抽象类后,使用就非常简单了 */
$bus = new buss;
$bus->bussStationToStation("火车站","五里墩"); //一切ok,直接就可以看到结果了 ?> |