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 が通ったディレクトリに配置すること。

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

 175: /**
 176:  * 元号を表示しやすいように配列に格納する
 177:  * @param   array $eras 元号を格納する配列
 178:  * @return  int 格納した元号の数
 179: */
 180: function getEras2(&$eras) {
 181:     //オブジェクト生成
 182:     $pnt = new pahooNormalizeText();
 183: 
 184:     $table = array($pnt->TABLE_AD_ERA2, $pnt->TABLE_AD_ERA1);
 185:     $cnt = 0;
 186:     foreach ($table as $tbl) {
 187:         foreach ($tbl as $key=>$val) {
 188:             //開始年月日
 189:             preg_match('/([0-9]{2})([0-9]{2})([0-9]{4})/', $key, $arr);
 190:             $hh = (int)$arr[1];     //時に相当(西暦上2桁)
 191:             $mm = (int)$arr[2];     //分に相当(西暦下2桁)
 192:             $ss = (int)$arr[3];     //秒に相当(月日)
 193:             $eras[$hh][$mm][$ss] = $val;
 194:             $cnt++;
 195:         }
 196:     }
 197:     //オブジェクト解放
 198:     $pnt = NULL;
 199: 
 200:     return $cnt;
 201: }

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

解説:時刻表を作成

 203: /**
 204:  * 時刻表を作成
 205:  * @param   array $eras  元号配列
 206:  * @return  string 表示テキスト(HTML)
 207: */
 208: function gengoTimeTable($eras) {
 209:     $caption1 = CAPTION1;
 210:     $caption2 = CAPTION2;
 211:     $html =<<< EOT
 212: <table class="titable">
 213: <caption>{$caption1}</caption>
 214: <tr><td colspan="2" class="index">{$caption2}</td></tr>
 215: 
 216: EOT;
 217:     foreach ($eras as $hh=>$arr1) {
 218:         if ($hh > 29)   continue;
 219:         $html ."<tr>\n<td class=\"hour\">{$hh}</td>\n<td>";
 220:         foreach ($arr1 as $mm=>$arr2) {
 221:             $m2 = sprintf("%02d", $mm);
 222:             foreach ($arr2 as $val) {
 223:                 if (mb_strlen($val) == 0)   continue;
 224:                 $html ."<ruby>{$m2}<rt>{$val}</rt></ruby>\n";
 225:             }
 226:         }
 227:         $html ."\n</td>\n</tr>\n";
 228:     }
 229:     $html ."</table>\n";
 230: 
 231:     return $html;
 232: }

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

参考情報

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

参考サイト

(この項おわり)
header