注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿飘的博客

十里平湖霜满天 寸寸青丝愁华年

 
 
 

日志

 
 

php 实现北京地铁查询  

2009-09-17 11:53:10|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
<?php
/*
*author:lifugang
*date:2009-9-17
*北京任意两点地铁查询
*/
require_once('sunway_array.php');
//定义一个新类
//实现公交换乘
class buss{
    //返回站点名
    function busstotal(){
        global $station;
        return $station;
    }

    //返回公交线路
    function busslinetotal(){
        global $line;
        return $line;
    }

    //统计中每一线路经过的站点,存入数组
    //需要参数line,区别每一路车
    //返回站点名
    function bussperline($line) {
        global $subway;
        return $subway[$line];
    }

    //统计经过某站点的所有公交车的组合
    //需要参数station,表示经过的站点
    //返回公交线路
    function passline($station) {
        global $station2line;
        return $station2line[$station];
    }

    //实现换乘算法的函数
    //需要提供参数,查询的起点和终点
    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)  { echo "$start站点不存在";exit; }
            if(!$flag2)  { echo "$end站点不存在"; exit;}
        }
        //两个站点都存在的情况
        //首先判断有无直达车
        echo("<strong><font color=#FF0000>".$start. "</font></strong> 到 <strong><font color=#FF0000>".$end."</font></strong><br/><pre>");
        $statpass = $this->passline($start);
        $endpass = $this->passline($end);
        $jiaoji = array_intersect($statpass,$endpass);
        if ($jiaoji) {
            foreach( $jiaoji as $jiaovalue) {
                $zhida = "在 {$start} 坐 {$jiaovalue} 在 {$end} 下车即可到达<br>";
                echo $zhida;
            }
        } else {
            //没有直达车,则计算一次换乘情况
            //查询一级中转站
            //start起点
            //end终点
            //函数回调,取得经过起点和终点的所有组合
            if (empty($zhida)) {
                $statpass = $this->passline($start);
                $endpass = $this->passline($end);
                //得到经过起点和终点的线路的全部组合
                $resultbus = "";
                foreach($statpass as $startkey => $startvalue) {//遍历线路
                    foreach($endpass as $endkey => $endvalue){
                        //判断两条线路有没有交叉点
                        $startper = $this->bussperline($startvalue);
                        $endper = $this->bussperline($endvalue);
                        if (array_intersect($startper,$endper)) {
                            foreach ($startper as $startperkey => $startpervalue) {//遍历点
                                foreach ($endper as $endperkey => $endpervalue) {
                                    if ($startpervalue==$endpervalue) {
                                        //成功找到交叉点后
                                        //存储交叉点处信息
                                        //此只为一次换乘
                                        $fistid = $startvalue;
                                        $secondid = $endvalue;
                                        $changestation = $startpervalue;
                                        $sss=  "在 {$start} 坐 {$fistid} 到 {$changestation} 换乘 {$secondid} 在 {$end} 下车即可到达<br>";
                                        echo $sss;
                                    }
                                }
                            }
                        } else {
                            //passline获取公交线路
                            //bussperline获取公交站点
                            if (empty($sss)) {
                                foreach ($startper as $startperkey => $startpervalue) {//遍历站点
                                    $statpasses = $this->passline($startpervalue);
                                    foreach ($statpasses as $statpasseskey => $statpassesvalue) {//遍历线路
                                        $startpers = $this->bussperline($statpassesvalue);
                                        if (array_intersect($startpers,$endper)) {
                                            foreach ($startpers as $startperskey => $startpersvalue) {//遍历站点
                                                foreach ($endper as $endperkey => $endpervalue) {
                                                    if ($startpersvalue==$endpervalue) {
                                                        $xxx =  "在 {$start} 坐 {$startvalue} 到 {$startpervalue} 换乘 {$statpassesvalue} 到 {$endpervalue} 换乘 {$endvalue} 在 {$end} 下车即可到达<br>";
                                                        echo $xxx;
                                                    }
                                                }
                                            }
                                        } else {
                                            if (empty($xxx)) {
                                                foreach ($startpers as $startperrk => $startperrs) {//遍历站点
                                                    $statpassess = $this->passline($startperrs);
                                                    foreach ($statpassess as $statpassesskey => $statpassessvalue) {//遍历线路
                                                        $startperses = $this->bussperline($statpassessvalue);
                                                        if (array_intersect($startperses,$endper)) {
                                                            foreach ($startperses as $startperserkey => $startperservalue) {//遍历站点
                                                                foreach ($endper as $endperkey => $endpervalue) {
                                                                    if ($startperservalue==$endpervalue) {
                                                                        echo "在 {$start} 坐 {$startvalue} 到 {$startpervalue} 换乘 {$statpassesvalue} 到 {$startperrs} 换乘{$statpassessvalue} 到 {$endpervalue} 换乘 {$endvalue} 在 {$end} 下车即可到达<br>";
                                                                    }
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}


//直接调用
$starttime = microtime(TRUE);
$startname = '西苑';
$endname = '土桥';
$bus = new buss;
$bus->bussStationToStation($startname,$endname);
$endtime = microtime(TRUE);
echo '花费时间:';
echo $endtime - $starttime;
//一切ok,直接就可以看到结果了

数组文件:sunway_array.php
网易不叫发了,谁需要可以留言。
  评论这张
 
阅读(1785)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017