PHP编程技能:以指定字段为索引返回数组数据

    添加时间:2013-7-1 点击量:

    很多景象下,我们从接触一个新的项目到开辟完成,再回过火来细心浏览一下本身写的代码,很多都是我们以前用谙练的代码。所以,在完成每个新项目标时 候,恰当的做些项目总结、代码总结,或许你会在今后的项目顶用得着,极有可能获合不测的收成,比如:代码优化,想到了更好、速度更快的实现办法等等。


    的法度开辟者有时辰不在于代码量的几许,而是法度的代码简洁性、逻辑错杂但实现的便利性,这些才申明是否是一位好的法度员。我们不做日夜加班到深夜,拼代码量的法度员!


    这篇博客和大师分享几个应用得PHP编程技能,有些技能是在看别人代码的时辰学来的,有些是本身总结的。


    以特定字段为索引,返回数据库取的数据数组


    举个例子轻易些:


    假如你要统计指定站点从其它网站来的流量景象,并且做一个小后台,查看每个网站天天带来的流量景象。我们先建2张数据表:


    表一、站点设备表(只统计这些网站的流量)



    CREATE TABLE `site_config` (
    
    `id` smallint(5) unsigned NOT NULL auto_increment COMMENT 主键,自增,
    `sid` smallint(5) unsigned NOT NULL COMMENT 网站ID,
    `site_url` varchar(128) NOT NULL COMMENT 网站URL地址,
    `site_name` varchar(80) NOT NULL COMMENT 网站名称,
    `add_time` timestamp NOT NULL default CURRENT_TIMESP COMMENT 添加时候,
    PRIMARY KEY (`id`),
    UNIQUE KEY `adid` (`sid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT=站点设备表;


     表二、站点流量统计表(来一个用户一笔记录)



    CREATE TABLE `site_stat` (
    
    `id` int(11) unsigned NOT NULL auto_increment COMMENT 主键,自增,
    `sid` smallint(5) unsigned NOT NULL COMMENT 网站ID,
    `ip_address` varchar(32) NOT NULL COMMENT 用户IP,
    `add_time` timestamp NOT NULL default CURRENT_TIMESP COMMENT 添加时候,
    PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=站点流量统计表 ;



    因为site_config表读操纵大于写操纵,所以类型设置为MyISAM;而site_stat表写操纵大于读操纵,是以,我把表类型设置为InnoDB。(这些处所也是你在设计数据的时辰须要推敲的,速度进步不少)。



    回到正题,假如表site_config里有如许几条数据:


    数据格局为:id,sid,site_url,add_time


    1,200,baidu.com,2013-06-30 14:20:00


    2,201,google.com,2013-06-30 14:20:00


    3,202,cnblogs.com,2013-06-30 14:20:00


    4,203,codejia.net,2013-06-30 14:20:00



    站点流量统计表site_stat里已经产生了一些数据,如下:


    数据格局为:id,sid,ip_address,add_time


    1,200,167.87.32.4,2013-06-30 14:40:00


    2,200,192.168.11.56,2013-06-30 14:40:10


    3,202,167.87.32.4,2013-06-30 14:40:10


    4,202,192.168.11.56,2013-06-30 14:40:20


    5,203,167.87.32.4,2013-06-30 14:40:20


    6,202,10.10.10.10,2013-06-30 14:40:30


    7,200,167.87.32.4,2013-06-30 14:40:31



    你在后台须要做的报表格局为:日期,网站ID,网站URL,流量数 (没有流量的站点也要显现,流量显示为0)


    你可能会想到按照日期,在表site_stat里按照sid group by之后再left join表site_config,这显然不是我将分享的办法。


    用2条SQL来搞定,一条是取所有的站点;另一条是取指定日期下站点流量统计数。



    SQL1取所有站点:



    SELECT sid,site_url,site_name FROM site_config
    


     SQL2取站点统计(假如为今天):



    SELECT sid,COUNT(1) AS come_total FROM site_stat
    
    WHERE add_time>=2013-06-30 00:00:00
    AND add_time<=2013-06-30 23:59:59
    GROUP BY sid


     前面说了一大堆都是为后面做铺垫,分享一个PHP以传畴昔的字段为索引,返回二维数组的办法:



    protected function getList(¥sql,¥filed = null){
    
    ¥res = mysql_query(¥sql,¥this->link_sc);
    ¥data = array();
    if(¥filed === null){
    while(¥row = mysql_fetch_assoc(¥res)){
    ¥data[] = ¥row;
    }
    }else{
    while(¥row = mysql_fetch_assoc(¥res)){
    ¥data[¥row[¥filed]] = ¥row;
    }
    }
    return ¥data;
    }



    把你的SQL传进入,并把须要索引的字段传进入就OK,前提是传进去的字段必必要在返回的字段里。


    我们在取所有站点的时辰不须要传畴昔字段,但在取站点流量统计的时辰我们把,站点sid传畴昔,即如下:



    ¥sites = getList(¥sql1);  //所有站点
    
    ¥data = getList(¥sql2,sid); //站点流量数据,以sid为索引返回二维数组


     最后在显现报表的时辰,用foreach轮回¥sites,取流量的时辰到数组¥data里去取索引为sid的数据就OK了。


    很是便利,并且很是轻易把握,我就经常这么干。


    最后看下上表的统计成果报表:


    格局为:日期,网站ID,网站URL,流量数


    2013-06-30,200,baidu.com,3


    2013-06-30,201,google.com,0


    2013-06-30,202,cnblogs.com,3


    2013-06-30,203,codejia.net,1



    总结:貌似写这么多就申明那样一个小的技能哈,然则,可切切别小看这个技能,能节俭你很多时候。所以,大师在写代码的时辰多多总结,多多来博客园和大师交换、进修,编程程度必然会进步很快的!

    我们永远不要期待别人的拯救,只有自己才能升华自己。自己已准备好了多少容量,方能吸引对等的人与我们相遇,否则再美好的人出现、再动人的事情降临身边,我们也没有能量去理解与珍惜,终将擦肩而过。—— 姚谦《品味》
    分享到: