PHPで元号を時刻表のように並べる

(1/1)
2019 年 5 月 1 日、令和元年が始まった。
PHP で過去の元号を分析する」に続き、今回は、大化(645 年)から令和(2019 年)までのすべての元号を、鉄道時刻表に並べて表示する PHP プログラムを作る。

南北朝時代については、南朝の元号を採用している。クラス pahooNormalizeText には北朝の元号がコメントアウトしてあるので、必要に応じて、南朝と切り替えてみてほしい。

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

PHPで元号を時刻表のように並べる
URL パラメータなしで、上図のような結果を表示する。

ホームページに埋め込む場合に利用できるように、URL パラメータとして mode を指定することができる。gTimeTable?mode=1 のようにして実行すると、TABLE のみの HTML 文を出力する。
画像は一切使用していないが、TABLE タグに対してスタイルシートを指定しており、これはホームページ側で適宜設定してほしい。

サンプル・プログラム

圧縮ファイルの内容
gengo.phpサンプル・プログラム本体
pahooNormalizeText.phpテキスト正規化クラス pahooNormalizeText。
テキスト正規化クラスの使い方は「PHPで日本語テキストを正規化」を参照。include_path が通ったディレクトリに配置すること。

解説:元号を表示しやすいように配列に格納する

0175: /**
0176:  * 元号を表示しやすいように配列に格納する
0177:  * @param array $eras 元号を格納する配列
0178:  * @return int 格納した元号の数
0179: */
0180: function getEras2(&$eras) {
0181:     //オブジェクト生成
0182:     $pnt = new pahooNormalizeText();
0183: 
0184:     $table = array($pnt->TABLE_AD_ERA2$pnt->TABLE_AD_ERA1);
0185:     $cnt = 0;
0186:     foreach ($table as $tbl) {
0187:         foreach ($tbl as $key=>$val) {
0188:             //開始年月日
0189:             preg_match('/([0-9]{2})([0-9]{2})([0-9]{4})/', $key$arr);
0190:             $hh = (int)$arr[1];      //時に相当(西暦上2桁)
0191:             $mm = (int)$arr[2];      //分に相当(西暦下2桁)
0192:             $ss = (int)$arr[3];      //秒に相当(月日)
0193:             $eras[$hh][$mm][$ss] = $val;
0194:             $cnt++;
0195:         }
0196:     }
0197:     //オブジェクト解放
0198:     $pnt = NULL;
0199: 
0200:     return $cnt;
0201: }

ユーザー関数 getEras2 は、クラス pahooNormalizeText の中に西暦⇔元号変換表を、分析しやすいような形に変換して配列に格納する。
配列の構造を以下に記す。
配列の内容
1次元 2次元 3次元 内  容
時に相当(西暦上2桁) 分に相当(西暦下2桁) 秒に相当(月日) 元号

解説:時刻表を作成

0203: /**
0204:  * 時刻表を作成
0205:  * @param array $eras  元号配列
0206:  * @return string 表示テキスト(HTML)
0207: */
0208: function gengoTimeTable($eras) {
0209:     $caption1 = CAPTION1;
0210:     $caption2 = CAPTION2;
0211: $html =<<< EOT
0212: <table class="titable">
0213: <caption>{$caption1}</caption>
0214: <tr><td colspan="2" class="index">{$caption2}</td></tr>
0215: 
0216: EOT;
0217:     foreach ($eras as $hh=>$arr1) {
0218:         if ($hh > 29)   continue;
0219:         $html .= "<tr>\n<td class=\"hour\">{$hh}</td>\n<td>";
0220:         foreach ($arr1 as $mm=>$arr2) {
0221:             $m2 = sprintf("%02d", $mm);
0222:             foreach ($arr2 as $val) {
0223:                 if (mb_strlen($val) == 0)   continue;
0224:                 $html .= "<ruby>{$m2}<rt>{$val}</rt></ruby>\n";
0225:             }
0226:         }
0227:         $html .= "\n</td>\n</tr>\n";
0228:     }
0229:     $html .= "</table>\n";
0230: 
0231:     return $html;
0232: }

飛鳥時代、元号が制定されなかった期間があり、西暦⇔元号変換表は空文字にしてある。また、新元号も空文字にしてある。
ユーザー関数 gengoTimeTable は、これらを読み飛ばし、有効な元号を TABLE に並べてゆく。

参考情報

本プログラムは、次のツイートにインスパイアされ、作成した。

参考サイト

(この項おわり)
header