php側
1.今日の年・月を取得する
2.Getパラメーターで先月・翌月の場合は、$monthを変更する
3.今月が1月の場合は前月の年、12月の場合は翌月の年を変更
4.年と月が一致するデータをDBから取得して、名前と営業成績を連想配列にする
5.array_multisortで、成績順にソートする
6.chart.jsにラベルとデータを渡すため、keyとvalueを配列にしてデコードする
$year = date("Y"); $month = date("m"); if(!empty($_GET["m"])){ $month = date("m", strtotime("".$_GET["m"]." month")); if($_GET["m"] == -1 && $month == 12){ $year= date("Y", strtotime("-1 year")); }elseif($_GET["m"] == 1 && $month == 1){ $year= date("Y", strtotime("+1 year")); } } $i = 0; while($result = $stmt->fetch(PDO::FETCH_ASSOC)){ if($year == substr($result['day'], 0, 4) && $month == substr($result['day'], 7, 2)){ $charge = $result['charge']; $book[$charge] += $result['course']; $total += $result['course']; $i++; } } foreach($book as $key => $value){ $time[$value] = $value; } array_multisort($time, SORT_DESC, $book); foreach($book as $key => $value){ $name_list[] = $key; $time_list[] = $value; } $name_l =json_encode($name_list); $time_l = json_encode($time_list);
js側
普通のchart.js棒グラフ
var name_arr = JSON.parse('<?php echo $name_l; ?>'); var time_arr = JSON.parse('<?php echo $time_l; ?>'); var ctx = document.getElementById("BarChart"); var BarChart = new Chart(ctx, { type : 'bar', data: { labels: name_arr, datasets:[{ label: "予約時間(分)", backgroundColor: "rgba(75, 192, 192, 0.4)", borderColor:"rgba(75, 192, 192, 1)", data: time_arr }] }, options: { scales: { yAxes: [{ ticks : { beginAtZero:true, } }] } } });
view側
1. switch文で、今月・先月・翌月を表示を出し分ける(if elseの方が良かったかも。。。)
2. canvasはdiv wrapperで囲ってサイズ調整
<?php switch($_GET["m"]){ case -1: echo "先月の総予約数: ".$i."件<br>"; echo "先月の総予約時間: ".$total."分<br>"; break; case 1: echo "来月の総予約数: ".$i."件<br>"; echo "来月の総予約時間: ".$total."分<br>"; break; default: echo "今月の総予約数: ".$i."件<br>"; echo "今月の総予約時間: ".$total."分<br>"; break; } ?> <div class="wrapper"> <canvas id="BarChart"></canvas><br> <center><a href="?m=-1">先月</a> | <a href="analytics.php">今月</a> | <a href="?m=1">翌月</a></center> </div>
結果:今月
翌月
あ、getパラメータは、date(“Ym”, strtotime(+-1 month));で良かったですね。。。