今天在工做中遇到一個需求,須要在數據表格中展現昨天與今天數據對比,我首先經過foreach嵌套來完成功能需求,具體過程以下:
1.經過數據庫分別查詢今天以及昨天的數據
//今天數據
$sql1 = "select tid,sum(total) as total from $table where tdate='2013-09-16' group by tid ";
$todayArr = mysql_query($sql1);
//昨天數據
$sql2 = "select tid,sum(total) as total from $table where tdate='2013-09-15' group by tid";
$yesArr = mysql_query($sql2);
//查詢得到以下結構數組數據
$todayArr = array(
'0' => array(
'tid' => 1,
'total' => 123
),
'1' => array(
>'tid' => 1,
'total' => 321
)
...
'$foo' => array(
'tid' => $foo,
'total' => $foo
)
);
$yesArr = array(
'0' => array(
'tid' => 1,
'total' => 456
),
'1' => array(
'tid' => 1,
'total' => 654
)
...
'$foo' => array(
'tid' => $foo,
'total' => $foo
)
);
2.經過foreach嵌套組裝須要的數組
foreach($todayArr as $key => $value){
foreach($yesArr as $k => $v){
//tid 爲主鍵惟一值
if($value['tid']==$v['tid']){
$todayArr[$key]['yes_total'] = $v['total'];
}
}
}
這樣編碼是能夠完成程序功能需求,可是當有實際的數據的量比較大時[我調試功能時的天數據是4000多條],這樣子的嵌套就會有16000屢次的循環輪詢,致使最終頁面運行數據十分緩慢,我經過microtime計算代碼的執行時間是17秒左右的[功能需求數據不分頁查詢]。
這樣子就想到減小循環次數來提升頁面執行速度,循環部分作了以下修改
foreach($todayArr as $key => $value){
foreach($yesArr as $k => $v){
if($value['tid']==$v['tid']){
$todayArr[$key]['yes_total'] = $v['total'];
break;
}
}
}
tid值惟一,當循環判斷條件成立以後則後面條件必定不成立,跳出當前循環。這樣的處理減小了循環的次數,頁面響應速度能夠提升1~2秒,可是仍是很慢。
接着想到,tid值惟一,對應惟一的key值,能夠由昨天數組數據tid值來肯定昨天數據與今天數據的關聯關係,循環部分修改代碼以下
$fooArr = array();
foreach($todayArr as $key => $value){
$fooArr[$value['tid']] = $key;
}
foreach($yesArr as $key => $value){
$todayArr[$fooArr[$value['tid']]]['yes_total'] = $value['total'];
}
經過兩次單個foreach循環,組裝關聯數組,肯定今天與昨天數據對應關係,驗證如今頁面響應數據大約爲2s,提高了15秒。 以上是個人工做學習筆記記錄,若有錯誤或其餘指導意見,感謝你的評價。