PHP編程技巧:以指定欄位為索引返回數組資料

來源:互聯網
上載者:User
很多情況下,我們從接觸一個新的項目到開發完成,再回過頭來仔細瀏覽一下自己寫的代碼,很多都是我們以前用熟練的代碼。所以,在完成每個新項目的時 候,適當的做些項目總結、代碼總結,或許你會在以後的項目中用得著,極有可能獲得意外的收穫,比如:代碼最佳化,想到了更好、速度更快的實現方法等等。

牛逼的程式開發人員有時候不在於代碼量的多少,而是程式的代碼簡潔性、邏輯複雜但實現的方便性,這些才說明是否是一位好的程式員。我們不做日夜加班到深夜,拼代碼量的程式員!

這篇部落格和大家分享幾個使用得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_TIMESTAMP 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_TIMESTAMP 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,前提是傳進去的欄位必須要在select返回的欄位裡。

我們在取所有網站的時候不需要傳過去欄位,但在取網站流量統計的時候我們把,網站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

總結:貌似寫這麼多就說明那樣一個小的技巧哈,但是,可千萬別小看這個技巧,能節約你很多時間。所以,大家在寫代碼的時候多多總結,多多來部落格園和大家交流、學習,編程水平一定會進步很快的!

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.