PHPでCOVID-19情報をグラフ表示

(1/1)
2019 年(平成 31 年)末頃より新型コロナウイルス感染症(COVID-19)が、中国の武漢市を中心に出現した。WHO の発表によると、2020 年(令和 2 年)4 月 16 日現在、世界の患者数は約 199 万人、死亡者数は約 13 万人に達した。
今回は、国内の COVID-19 感染の推移を、最新のデータを読み込んでグラフ表示する PHP プログラムを作ってみることにする。

本プログラムで参照するデータは、東洋経済オンライン編集部の荻原和樹さんが「新型コロナウイルス国内感染の状況」(MIT ライセンス)として公開しているもの、および、jig.jp 創業者&会長の福野泰介さんが「新型コロナウイルス対策ダッシュボード」として公開しているものをマッシュアップした。

(2020 年 7 月 27 日)実効再生産数に対応。データ形式変更に対応。
(2020 年 7 月 26 日)データ形式変更に対応。
(2020 年 7 月 12 日)Y軸の最大値を追加

サンプル・プログラム:実行例

PHPでCOVID-19情報をグラフ表示

目次

サンプル・プログラム

圧縮ファイルの内容
viewCOVID-19.phpサンプル・プログラム本体
pahooStat.php統計に関わるクラス pahooStat。
使い方は「PHPで太陽黒点相対数の周期変化を描く」を参照。

準備:初期値

0023: //リリース・フラグ(公開時にはTRUEにすること)
0024: define('FLAG_RELEASE', TRUE);
0025: 
0026: //リファラ・チェック(直リン防止用;空文字ならチェックしない)
0027: define('REFER_ON', 'www.pahoo.org');
0028: //define('REFER_ON', '');
0029: 
0030: //移動平均区間;日
0031: define('INTERVAL', 10);
0032: 
0033: //グラフの表示幅・高さ(単位:ピクセル)
0034: define('WIDTH',  600);
0035: define('HEIGHT', 400);
0036: 
0037: //グラフの色
0038: define('COLOR_COVID', '#88CCFF');
0039: define('COLOR_MEAN',  '#CC0000');
0040: 
0041: //jqPlotのあるフォルダ
0042: define('JQPLOT', '../../../../common/jqplot/');
0043: 
0044: //データファイル名
0045: define('DATA_FILE1', 'https://raw.githubusercontent.com/kaz-ogiwara/covid19/master/data/data.json');                     //グラフ描画情報
0046: define('DATA_FILE_BEDS1', 'https://raw.githubusercontent.com/code4sabae/covid19/master/data/bedforinfection_current.json'); //感染症ベッド数
0047: define('DATA_FILE_BEDS2', 'https://raw.githubusercontent.com/code4sabae/covid19/master/data/bedforinfection_summary.json'); //感染症ベッド数
0048: define('DATA_FILE_NP1', 'https://raw.githubusercontent.com/code4sabae/covid19/master/data/covid19japan-fast.json');         //現在の入院患者数
0049: define('DATA_FILE_NP2', 'https://raw.githubusercontent.com/code4sabae/covid19/master/data/covid19japan-all.json');         //現在の入院患者数

上記の初期値は任意に変更が可能である。

グラフ描画のために、「PHP で NHK 政治意識月例調査をグラフ表示」で紹介したjQuery のプラグイン jqPlot を用いた。プラグインをダウンロードしたら解凍して、そのパスを定数 JQPLOT に定義する。

参照データは、東洋経済オンライン編集部の荻原和樹さんが「新型コロナウイルス国内感染の状況」として公開しているもの、および、jig.jp 創業者&会長の福野泰介さんが「新型コロナウイルス対策ダッシュボード」として公開しているもので、いずれもデータ本体 GitHub に JSON や CSV 形式で格納している。

解説:データ・ファイルを読み込む

0221: /**
0222:  * データ・ファイルを読み込む、COVID-19グラフ描画情報を取得
0223:  * @param string $fname 入力ファイル名
0224:  * @param array  $data  データ格納配列
0225:  * @return bool TRUE/FALSE
0226: */
0227: function readDataFile($fname, &$data) {
0228:     global $TablePref;
0229: 
0230:     //データ読み込み
0231:     $contents = file_get_contents($fname);
0232:     if ($contents == FALSE)     return FALSE;
0233:     $data = json_decode($contentsTRUE);
0234: 
0235:     //都道府県テーブル作成
0236:     foreach ($data['prefectures-map'] as $key=>$arr) {
0237:         $code = $arr['code'];
0238:         $TablePref[$code]['en'] = $arr['en'];
0239:         $TablePref[$code]['ja'] = $arr['ja'];
0240:     }
0241: 
0242:     return TRUE;
0243: }

COVID-19 グラフ描画を GitHub のファイルから読み込み、組み込み関数  json_decode  によって配列に展開する。
また、後述するベッド数や患者数を集計するために、都道府県名をグローバル変数 $TablePref に格納する。

0245: /**
0246:  * データ・ファイルを読み込み、現在の都道府県別ベッド数を取得
0247:  * @param array  $items 都道府県別ベッド数格納用
0248:  * @return int 全国ベッド数/FALSE
0249: */
0250: function readBeds(&$items) {
0251:     global $TablePref;
0252: 
0253:     //データファイル(その1)
0254:     $contents = file_get_contents(DATA_FILE_BEDS1);
0255:     if ($contents == FALSE)     return FALSE;
0256:     $data = json_decode($contentsTRUE);
0257:     $cnt = 0;
0258:     foreach ($data as $key=>$arr) {
0259:         if (isset($arr['自治体名']) && isset($arr['新型コロナウイルス対策感染症病床数']) && isset($arr['発表日'])) {
0260:             $pref = $arr['自治体名'];
0261:             $yyyymmdd = $arr['発表日'];
0262:             //新規登録
0263:             if (! isset($items[$pref])) {
0264:                 $items[$pref]['date'] = $yyyymmdd;
0265:                 $items[$pref]['val']  = (int)$arr['新型コロナウイルス対策感染症病床数'];
0266:             } else if ($yyyymmdd > $items[$pref]['date']) {
0267:                 $items[$pref]['date'] = $yyyymmdd;
0268:                 $items[$pref]['val']  = (int)$arr['新型コロナウイルス対策感染症病床数'];
0269:             }
0270:         }
0271:     }
0272: 
0273:     //データファイル(その2)
0274:     $contents = file_get_contents(DATA_FILE_BEDS2);
0275:     if ($contents == FALSE)     return FALSE;
0276:     $data = json_decode($contentsTRUE);
0277:     $cnt = 0;
0278:     foreach ($TablePref as $code=>$arr1) {
0279:         if (! isset($items[$arr1['ja']])) {
0280:             foreach ($data['area'] as $key=>$arr2) {
0281:                 if ($arr2['name_ja'] == $arr1['ja']) {
0282:                     $items[$arr1['ja']]['val'] = $arr2['sum'];
0283:                     break;
0284:                 }
0285:             }
0286:         }
0287:     }
0288: 
0289:     //合計
0290:     $cnt = 0;
0291:     foreach ($items as $arr)    $cnt += $arr['val'];
0292: 
0293:     return $cnt;
0294: }

現在の都道府県別ベッド数を GitHub の 2 つのファイルから読み込み、組み込み関数  json_decode  によって配列に展開する。

0296: /**
0297:  * データ・ファイルを読み込み、現在の都道府県別入院患者数を取得
0298:  * @param array  $items 都道府県別入院患者数格納用
0299:  * @return int 全国入院患者数/FALSE
0300: */
0301: function readNP(&$items) {
0302:     global $TablePref;
0303: 
0304:     //データファイル(その1)
0305:     $contents = file_get_contents(DATA_FILE_NP1);
0306:     if ($contents == FALSE)     return FALSE;
0307:     $data = json_decode($contentsTRUE);
0308:     $cnt = 0;
0309:     foreach ($data as $key=>$arr) {
0310:         if (isset($arr['name']) && isset($arr['ncurrentpatients']) && isset($arr['lastUpdate'])) {
0311:             $pref = $arr['name'];
0312:             $yyyymmdd = $arr['lastUpdate'];
0313:             //新規登録
0314:             if (! isset($items[$pref])) {
0315:                 $items[$pref]['date'] = $yyyymmdd;
0316:                 $items[$pref]['val']  = (int)$arr['ncurrentpatients'];
0317:             } else if ($yyyymmdd > $items[$pref]['date']) {
0318:                 $items[$pref]['date'] = $yyyymmdd;
0319:                 $items[$pref]['val']  = (int)$arr['ncurrentpatients'];
0320:             }
0321:         }
0322:     }
0323: 
0324:     //データファイル(その2)
0325:     $contents = file_get_contents(DATA_FILE_NP2);
0326:     if ($contents == FALSE)     return FALSE;
0327:     $data = json_decode($contentsTRUE);
0328:     $cnt = 0;
0329:     foreach ($TablePref as $code=>$arr1) {
0330:         if (! isset($items[$arr1['ja']])) {
0331:             foreach ($data as $key=>$arr2) {
0332:                 if (preg_match('/現在は入院/ui', $arr2['description']) > 0) {
0333:                     foreach ($arr2['area'] as $key=>$arr3) {
0334:                         if ($arr3['name'] == $arr1['en']) {
0335:                             if (! isset($items[$arr1['en']]['val'])) {
0336:                                 $items[$arr1['en']]['val'] = $arr3['ncurrentpatients'];
0337:                             }
0338:                             break;
0339:                         }
0340:                     }
0341:                     break;
0342:                 }
0343:             }
0344:         }
0345:     }
0346: 
0347:     //合計
0348:     $cnt = 0;
0349:     foreach ($items as $arr)    $cnt += $arr['val'];
0350: 
0351:     return $cnt;
0352: }

現在の都道府県別入院患者数を GitHub の 2 つのファイルから読み込み、組み込み関数  json_decode  によって配列に展開する。

解説:感染者数(累計)を計算

0354: /**
0355:  * 感染者数(累計)を計算
0356:  * @param array $data データ配列
0357:  * @param int   $code  都道府県コード(0は全国)
0358:  * @return array 計算結果
0359: */
0360: function total_carriers($data$code) {
0361:     $items = array();
0362:     $cnt = 0;
0363:     //都道府県
0364:     if (($code >= 1) && ($code <= 47)) {
0365:         $ofst = $code - 1;
0366:         $sour = $data['prefectures-data'][$ofst]['carriers'];
0367:     //全国
0368:     } else {
0369:         $sour = $data['transition']['carriers'];
0370:         $ofst = 0;
0371:     }
0372:     //開始日
0373:     $ti = mktime(0, 0, 0, $sour['from'][1], $sour['from'][2], $sour['from'][0]);
0374:     //感染者数
0375:     foreach ($sour['values'] as $key=>$val) {
0376:         if (($code >= 1) && ($code <= 47)) {
0377:             if ($cnt == 0) {
0378:                 $items[$cnt]['val'] = (int)$val;
0379:             } else {
0380:                 $items[$cnt]['val'] = (int)$val + $items[$cnt - 1]['val'];
0381:             }
0382:         } else {
0383:             if ($cnt == 0) {
0384:                 $items[$cnt]['val'] = (int)$val[$ofst];
0385:             } else {
0386:                 $items[$cnt]['val'] = (int)$val[$ofst] + $items[$cnt - 1]['val'];
0387:             }
0388:         }
0389:         $items[$cnt]['year']  = (int)date('Y', $ti);
0390:         $items[$cnt]['month'] = (int)date('m', $ti);
0391:         $items[$cnt]['day']   = (int)date('d', $ti);
0392:         $cnt++;
0393:         $ti = strtotime('+1 day', $ti);
0394:     }
0395: 
0396:     return $items;
0397: }

データ・ファイルには、日々の感染者数の累計が記録されている。これをグラフ描画しやすいように、配列 $items へ格納してゆく。

解説:新規感染者数を計算

0399: /**
0400:  * 新規感染者数を計算
0401:  * @param array $data  データ配列
0402:  * @param int   $code  都道府県コード(0は全国)
0403:  * @return array 計算結果
0404: */
0405: function diff_carriers($data$code=0) {
0406:     $items = array();
0407:     $cnt = 0;
0408:     //都道府県
0409:     if (($code >= 1) && ($code <= 47)) {
0410:         $ofst = $code - 1;
0411:         $sour = $data['prefectures-data'][$ofst]['carriers'];
0412:     //全国
0413:     } else {
0414:         $sour = $data['transition']['carriers'];
0415:         $ofst = 0;
0416:     }
0417:     //開始日
0418:     $ti = mktime(0, 0, 0, $sour['from'][1], $sour['from'][2], $sour['from'][0]);
0419:     //感染者数
0420:     foreach ($sour['values'] as $key=>$val) {
0421:         if (($code >= 1) && ($code <= 47)) {
0422:             $items[$cnt]['val'] = (int)$val;
0423:         } else {
0424:             $items[$cnt]['val'] = (int)$val[$ofst];
0425:         }
0426:         $items[$cnt]['year']  = (int)date('Y', $ti);
0427:         $items[$cnt]['month'] = (int)date('m', $ti);
0428:         $items[$cnt]['day']   = (int)date('d', $ti);
0429:         $cnt++;
0430:         $ti = strtotime('+1 day', $ti);
0431:     }
0432: 
0433:     return $items;
0434: }

データ・ファイルには、日々の感染者数の累計が記録されている。そこで、当日の感染者数から前日の感染者数を減算することで、増加数を求めることができる。

解説:PCR検査数を計算

0436: /**
0437:  * PCR検査数を計算
0438:  * @param array $data  データ配列
0439:  * @param int   $code  都道府県コード(0は全国)
0440:  * @return array 計算結果
0441: */
0442: function PCRtested($data$code=0) {
0443:     $items = array();
0444:     $cnt = 0;
0445:     //都道府県
0446:     if (($code >= 1) && ($code <= 47)) {
0447:         $ofst = $code - 1;
0448:         $sour = $data['prefectures-data'][$ofst]['pcrtested'];
0449:     //全国
0450:     } else {
0451:         $sour = $data['transition']['pcrtested'];
0452:         $ofst = 0;
0453:     }
0454:     //開始日
0455:     $ti = mktime(0, 0, 0, $sour['from'][1], $sour['from'][2], $sour['from'][0]);
0456:     //PCR検査件数
0457:     foreach ($sour['values'] as $key=>$val) {
0458:         if (($code >= 1) && ($code <= 47)) {
0459:             $items[$cnt]['val'] = (int)$val[0];
0460:         } else {
0461:             $items[$cnt]['val'] = (int)$val[$ofst];
0462:         }
0463:         $items[$cnt]['year']  = (int)date('Y', $ti);
0464:         $items[$cnt]['month'] = (int)date('m', $ti);
0465:         $items[$cnt]['day']   = (int)date('d', $ti);
0466:         $cnt++;
0467:         $ti = strtotime('+1 day', $ti);
0468:     }
0469: 
0470:     return $items;
0471: }

データ・ファイルには、日々の PCR 検査数の累計が記録されている。そこで、当日の検査数から前日の検査数を減算することで、その日の検査数を求めることができる。

解説:PCR陽性率(日次)を計算

0473: /**
0474:  * PCR陽性率(日次)を計算
0475:  * @param array $data  データ配列
0476:  * @param int   $code  都道府県コード(0は全国)
0477:  * @return array 計算結果
0478: */
0479: function rate_PCRtested($data$code=0) {
0480:     $items = array();
0481:     $cnt = 0;
0482:     //都道府県
0483:     if (($code >= 1) && ($code <= 47)) {
0484:         $ofst = $code - 1;
0485:         $sour1 = $data['prefectures-data'][$ofst]['carriers'];
0486:         $sour2 = $data['prefectures-data'][$ofst]['pcrtested'];
0487:     //全国
0488:     } else {
0489:         $ofst = 0;
0490:         $sour1 = $data['transition']['carriers'];
0491:         $sour2 = $data['transition']['pcrtested'];
0492:     }
0493:     //開始日
0494:     $ti1 = mktime(0, 0, 0, $sour1['from'][1], $sour1['from'][2], $sour1['from'][0]);
0495: 
0496:     //感染者数
0497:     foreach ($sour1['values'] as $key1=>$val1) {
0498:         //PCR検査件数
0499:         $ti2 = mktime(0, 0, 0, $sour2['from'][1], $sour2['from'][2], $sour2['from'][0]);
0500:         foreach ($sour2['values'] as $key2=>$val2) {
0501:             //感染者数とPCR検査件数の日付を合わせる
0502:             if ($ti1 == $ti2) {
0503:                 if (($code >= 1) && ($code <= 47)) {
0504:                     if ($sour2['values'][$key1] == 0) {
0505:                         $items[$cnt]['val'] = 0.0;
0506:                     } else {
0507:                         if ($val2[0] == 0) {
0508:                             $items[$cnt]['val'] = 0.0;
0509:                         } else {
0510:                             $items[$cnt]['val'] = $val1[0] / $val2[0] * 100.0;
0511:                         }
0512:                     }
0513:                 } else {
0514:                     if ($val2[$ofst] == 0) {
0515:                         $items[$cnt]['val'] = 0.0;
0516:                     } else {
0517:                         if ($val2[0] == 0) {
0518:                             $items[$cnt]['val'] = 0.0;
0519:                         } else {
0520:                             $items[$cnt]['val'] = $val1[$ofst] / $val2[$ofst] * 100.0;
0521:                         }
0522:                     }
0523:                 }
0524:                 $items[$cnt]['year']  = (int)date('Y', $ti1);
0525:                 $items[$cnt]['month'] = (int)date('m', $ti1);
0526:                 $items[$cnt]['day']   = (int)date('d', $ti1);
0527:                 $cnt++;
0528:                 break;
0529:             }
0530:             $ti2 = strtotime('+1 day', $ti2);
0531:         }
0532:         $ti1 = strtotime('+1 day', $ti1);
0533:     }
0534: 
0535:     return $items;
0536: }

データ・ファイルには、日々の PCR 検査数の累計と、検査陽性者数の累計が記録されている。そこで、当日と前日の差分を取り、割り算することで、陽性率を求めることができる。

解説:現在の患者数を計算

0575: /**
0576:  * 現在の患者数を計算
0577:  * @param array $data データ配列
0578:  * @param int   $code  都道府県コード(0は全国)
0579:  * @return array 計算結果
0580: */
0581: function last_cases($data$code) {
0582:     $items = array();
0583:     $cnt = 0;
0584:     //全国
0585:     $sour = $data['transition']['cases'];
0586:     $ofst = 0;
0587:     //開始日
0588:     $ti = mktime(0, 0, 0, $sour['from'][1], $sour['from'][2], $sour['from'][0]);
0589: 
0590:     //患者数
0591:     foreach ($sour['values'] as $key=>$arr) {
0592:         $items[$cnt]['val']   = (int)$sour['values'][$key][$ofst];
0593:         $items[$cnt]['year']  = (int)date('Y', $ti);
0594:         $items[$cnt]['month'] = (int)date('m', $ti);
0595:         $items[$cnt]['day']   = (int)date('d', $ti);
0596:         $cnt++;
0597:         $ti = strtotime('+1 day', $ti);
0598:     }
0599: 
0600:     return $items;
0601: }

データ・ファイルには、日々の患者数が記録されている。このデータは全国のみとなっている。

解説:jqPlot用のスクリプト

0603: /**
0604:  * jqPlot用のスクリプト
0605:  * @param array  $items データ配列
0606:  * @param string $pref  都道府県名
0607:  * @param string $title グラフのタイトル
0608:  * @param bool   $log   TRUE:縦軸は対数/FALSE:通常(省略時)
0609:  * @param bool   $int   TRUE:縦軸は整数(省略時)/FALSE:小数
0610:  * @param float  $ymax  Y軸の最大値(省略時:空文字=データの最大値)
0611:  * @return string スクリプト
0612: */
0613: function plot($items$pref='', $title$log=FALSE$int=TRUE$ymax='') {
0614:     //Y軸の最大値
0615:     if ($ymax != '') {
0616:         $ymax = sprintf('max: %f,', $ymax);
0617:     }
0618: 
0619:     //グラフの色
0620:     $color_covid = COLOR_COVID;
0621:     $color_mean  = COLOR_MEAN;
0622:     //移動平均を求める区間(日)
0623:     $interval = INTERVAL;
0624: 
0625:     //移動平均
0626:     $x = array();
0627:     $y = array();
0628:     foreach ($items as $key=>$val)  $x[$key] = $val['val'];
0629:     //統計オブジェクト
0630:     $pst = new pahooStat();
0631:     $pst->simple_moving_average(INTERVAL$x$y);        //移動平均
0632:     $pst = NULL;
0633:     foreach ($y as $key=>$val)  $items[$key]['mean'] = $val;
0634: 
0635:     $series = '';
0636:     $xmin = '';
0637:     $xmax = '';
0638:     $rendere_yaxis = $log ? 'renderer: $.jqplot.LogAxisRenderer' : 'min: 0';
0639:     $format_yaxis  = $int ? "%'d" : "%.1f";
0640: 
0641:     //系列の生成
0642:     $cnt = 0;
0643:     $s1 = $s2 = '';
0644:     foreach ($items as $key=>$val) {
0645:         $xmax = sprintf("%04d-%02d-%02d", $val['year'], $val['month'], $val['day']);
0646:         if ($key == 0)  $xmin = $xmax;
0647:         $s1 .= isset($val['val']) ? sprintf("['%s', %.3f],", $xmax$val['val']) : '';
0648:         $s2 .= isset($val['mean']) ? sprintf("['%s', %.3f],", $xmax$val['mean']) : '';
0649:         $cnt++;
0650:     }
0651:     $barwidth = (int)(WIDTH / $cnt * 0.7);
0652: 
0653: $js =<<< EOD
0654: jQuery(function() {
0655:     jQuery.jqplot('jqPlot_polls',
0656:     [
0657:         [ {$s1} ],
0658:         [ {$s2} ]
0659:     ],
0660:     {
0661:         //タイトル
0662:         title: {
0663:             text: '{$pref}の{$title}',
0664:             show: true,
0665:             fontFamily: 'serif',
0666:             fontSize: '20px',
0667:             textAlign: 'center',
0668:             textColor: 'black',
0669:         },
0670:         //系列
0671:         series: [
0672:         {
0673:             label: '{$title}',
0674:             color: '{$color_covid}',
0675:             renderer: jQuery . jqplot . BarRenderer,
0676:             rendererOptions: {
0677:                 barWidth: {$barwidth},
0678:                 shadowOffset: 0
0679:             }
0680:         },
0681:         {
0682:             label: '{$interval}日移動平均',
0683:             color: '{$color_mean}'
0684:         },
0685:         ],
0686:         legend: {
0687:             show: true,
0688:             placement: 'inside',
0689:             location: 'nw',
0690:             renderer: $.jqplot.EnhancedLegendRenderer,
0691:             rendererOptions: { numberRows: 1 }
0692:         },
0693:         seriesDefaults: {
0694:             showLine: true,
0695:             rendererOptions: { smooth: false },
0696:             markerOptions: { size: 0 },
0697:         },
0698:         //軸
0699:         axes: {
0700:             xaxis: {
0701:                 renderer:$.jqplot.DateAxisRenderer,
0702:                 tickOptions: { formatString: '%m/%d' },
0703:                 label: '日付',
0704:                 min: '{$xmin}',
0705:                 max: '{$xmax}',
0706:             },
0707:             yaxis: {
0708:                 {$ymax}
0709:                 {$rendere_yaxis},
0710:                 labelRenderer: $.jqplot.CanvasAxisLabelRenderer,
0711:                 label: '{$title}',
0712:                 tickOptions: {
0713:                     formatString: "{$format_yaxis}",
0714:                     angle: -30,
0715:                 }
0716:             }
0717:         },
0718:         //ハイライター
0719:         highlighter: {
0720:             show: true,
0721:             showMarker: true,
0722:             tooltipLocation: 'sw',
0723:             fadeTooltip: false,
0724:             bringSeriesToFront: true,
0725:             tooltipAxes: 'xy',
0726:             formatString: '%s<br />%s'
0727:         }
0728:     }
0729:     );
0730: });
0731: 
0732: EOD;
0733: 
0734:     return $js;
0735: }

データ配列を与え、jqPlot 用のスクリプトを生成する。
感染者数(累計)を表示するときなどには、「指数関数的に増えている」という話を見やすくするために、縦軸を対数軸にできるようにしている。

実数を棒グラフで、移動平均を折れ線グラフで表示する。
移動平均については、「PHP で太陽黒点相対数の周期変化を描く」で紹介したとおりである。

解説:データ読み込み~グラフ描画

0798:     //処理選択ラジオボタン
0799:     $str_radio = '';
0800:     $i = 1;
0801:     foreach ($SelectFuncs as $key=>$val) {
0802:         $str_radio .= "<input type=\"radio\" name=\"func\" value=\"{$key}\" {$val['checked']} />{$val['title']} ";
0803:         if ($i % 3 == 0)    $str_radio .= '<br />';
0804:         $i++;
0805:     }
0806: 
0807:     //データ読み込み
0808:     $data = array();
0809:     $items = array();
0810:     readDataFile(DATA_FILE1$data);
0811:     if ($func == 'last_cases') {
0812:         $data['prefectures-map'] = NULL;
0813:     }
0814: 
0815:     //感染症ベッド数
0816:     $beds = array();
0817:     $beds_total = readBeds($beds);
0818:     $bed = ($pref == 0) ? $beds_total : $beds[$TablePref[$pref]['ja']]['val'];
0819:     $bed = number_format($bed);
0820: 
0821:     //入院患者数
0822:     $nps = array();
0823:     $nps_total = readNP($nps);
0824:     $np = ($pref == 0) ? $nps_total : $nps[$TablePref[$pref]['en']]['val'];
0825:     $np = number_format($np);
0826: 
0827:     //グラフ描画
0828:     if ($res == '') {
0829:         $selector = makeSelector($data$pref);
0830:         $items = $func($data$pref);
0831:         $flag = TRUE;
0832:         if ($flag) {
0833:             //jqPlot
0834:             $js = plot($itemsgetPref($data$pref), $SelectFuncs[$func]['title'], $SelectFuncs[$func]['log'], $SelectFuncs[$func]['int'], $SelectFuncs[$func]['ymax']);
0835: $res =<<< EOD
0836: <script>
0837: {$js}
0838: </script>
0839: <div id="jqPlot_polls" style="margin-top:20px; width:{$width}px; height:{$height}px;"></div>
0840: <p>現在の入院患者数:{$np}人 感染症ベッド数:{$bed}床</p>
0841: 
0842: EOD;

前述のユーザー関数は、ラジオボタンに応じて変数 $func によって呼び出すようにしている。

参考サイト

(この項おわり)
header