受付者ごとの一日の受付本数をtable表示するプログラムを作成しているのですが、表示に時間がかかってしまいます。
何とか素早く表示させたいのですが、どのように書き換えれば早く表示ができるようになるか、お知恵を貸していただけないでしょうか?
条件としては
・表示開始日と終了日は選択できる必要がある
・稼働している受付者全員分を表示する
・受付者ID・名前も別DBから取得
・表示は縦に日付、横に受付者名
です。
完成させたいのは以下のような表になります。
![イメージ説明]WIDTH:600
今のプログラムは以下の通りです。
lang
1//開始~終了までの日数を計算・期間内の日付を配列に格納 2$span = (strtotime($end_day)-strtotime($start_day))/(60*60*24); 3for($i=0 ; $i<= $span ; $i++){ 4 $getdate = strtotime("$i day",strtotime($start_day)); 5 $dates[$i] = date("Y-m-d",$getdate); 6} 7 8$sql_d = "SELECT receiver_id, 9 receiver_name 10 FROM receiver 11 WHERE receiver_register = 0 12 AND receiver_id > 0 13 ORDER BY receiver_id"; 14$res_d = $conDB->query($sql_d); 15 16foreach($res_d AS $key=>$val){ 17 $receiver[$val['receiver_id']] = $val['receiver_name']; 18} 19 20foreach($receiver AS $key=>$value){//① 21 $name = $value; 22 $cnt = ""; 23 $cnt_td = ""; 24 $td = ""; 25 $sum = ""; 26 foreach($dates AS $d_key=>$date){//② 27 $td .= "<tr><td>".$date."</td></tr>"; 28 $sql = "SELECT count(*) as cnt, 29 DATE_FORMAT(sales_date,'%Y-%m-%d') AS sdate, 30 sales_reception AS rcpt, 31 sales_date 32 FROM sales 33 WHERE sales_reception = '$key' 34 GROUP BY sales_reception,sdate 35 HAVING sdate = '$date'"; 36 $res = $conDB->query($sql); 37 38 if(!$res){ 39 $cnt[] = 0; 40 }else{ 41 $cnt[] = $res[0]['cnt']; 42 } 43 } 44 foreach($cnt AS $count){ 45 $sum += $count; 46 $cnt_td .= "<tr><td>".$count."</td></tr>"; 47 } 48 49 $html .= "<td><table ><tr><td>".$name."</td></tr>".$cnt_td."<tr><td>".$sum."</td></tr></table></td>"; 50} 51$date_html = "<td><table width='120px'><tr><td>日付</td></tr>".$td."<tr><td>合計</td></table></td>";
処理速度を測ったところ、
②の処理が1回で0.1秒程度×日数分なので一月なら3秒程度
①全体ではそれ掛ける15人分で45秒ほどかかってしまいます。
条件さえ満たせば中身はどのような形でも構いません。
よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。