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

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

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

(2024年5月18日)Chrome, Edgeで隣り合う元号が重なる不具合を修正

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

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

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

サンプル・プログラム

圧縮ファイルの内容
gTimeTable.phpサンプル・プログラム本体
pahooNormalizeText.phpテキスト正規化クラス pahooNormalizeText。
テキスト正規化クラスの使い方は「PHPで日本語テキストを正規化」を参照。include_path が通ったディレクトリに配置すること。
gTimeTable.php 更新履歴
バージョン 更新日 内容
1.1.0 2024/05/18 Chrome, Edgeで隣り合う元号が重なる不具合を修正
1.0 2019/05/02 初版
pahooNormalizeText.php 更新履歴
バージョン 更新日 内容
4.0 2021/11/03 getRuby_Yahoo():subwordを格納するようにした
3.91 2021/10/07 getRuby_Yahoo():デバッグコードを消去
3.9 2021/09/26 getRuby_Yahoo():ルビ振り(V2)に変更
3.8 2020/07/11 getRuby_Yahoo(): ローマ字も取得
3.71 2020/06/30 http(): each()関数をforeachで代替:PHP7.2対応

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

 191: /**
 192:  * 元号を表示しやすいように配列に格納する
 193:  * @param   array $eras 元号を格納する配列
 194:  * @return  int 格納した元号の数
 195: */
 196: function getEras2(&$eras) {
 197:     //オブジェクト生成
 198:     $pnt = new pahooNormalizeText();
 199: 
 200:     $table = array($pnt->TABLE_AD_ERA2, $pnt->TABLE_AD_ERA1);
 201:     $cnt = 0;
 202:     foreach ($table as $tbl) {
 203:         foreach ($tbl as $key=>$val) {
 204:             //開始年月日
 205:             preg_match('/([0-9]{2})([0-9]{2})([0-9]{4})/', $key, $arr);
 206:             $hh = (int)$arr[1];     //時に相当(西暦上2桁)
 207:             $mm = (int)$arr[2];     //分に相当(西暦下2桁)
 208:             $ss = (int)$arr[3];     //秒に相当(月日)
 209:             $eras[$hh][$mm][$ss] = $val;
 210:             $cnt++;
 211:         }
 212:     }
 213:     //オブジェクト解放
 214:     $pnt = NULL;
 215: 
 216:     return $cnt;
 217: }

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

解説:時刻表を作成

 219: /**
 220:  * 時刻表を作成
 221:  * @param   array $eras  元号配列
 222:  * @return  string 表示テキスト(HTML)
 223: */
 224: function gengoTimeTable($eras) {
 225:     $caption1 = CAPTION1;
 226:     $caption2 = CAPTION2;
 227:     $html =<<< EOT
 228: <table class="titable">
 229: <caption>{$caption1}</caption>
 230: <tr><td colspan="2" class="index">{$caption2}</td></tr>
 231: 
 232: EOT;
 233:     foreach ($eras as $hh=>$arr1) {
 234:         if ($hh > 29)   continue;
 235:         $html ."<tr>\n<td class=\"hour\">{$hh}</td>\n<td class=\"minuite\">";
 236:         foreach ($arr1 as $mm=>$arr2) {
 237:             $m2 = sprintf("%02d", $mm);
 238:             foreach ($arr2 as $val) {
 239:                 $len = mb_strlen($val);
 240:                 if ($len == 0)  continue;
 241:                 $style = ($len > 2? ' style="zoom:0.6;"' : '';
 242:                 $html ."<ruby>{$m2}<rt{$style}>{$val}</rt></ruby>\n";
 243:             }
 244:         }
 245:         $html ."\n</td>\n</tr>\n";
 246:     }
 247:     $html ."</table>\n";
 248: 
 249:     return $html;
 250: }

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

元号が2文字を超えた場合、Firefoxでは正常に表示するのだが、EdgeやChromeでは隣り合う元号が重なってしまう。そこで、2文字を超える場合にはCSSのzoomを使って文字サイズを小さくするようにした。(rubyに対してfont-sizeは効かないようだ)

参考情報

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

参考サイト

(この項おわり)
header