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


ホームページに埋め込む場合に利用できるように、URLパラメータとして mode を指定することができる。gTimeTable?mode=1 のようにして実行すると、TABLEのみのHTML文を出力する。
画像は一切使用していないが、TABLEタグに対してスタイルシートを指定しており、これはホームページ側で適宜設定してほしい。
サンプル・プログラム
gTimeTable.php | サンプル・プログラム本体 |
pahooNormalizeText.php | テキスト正規化クラス pahooNormalizeText。 テキスト正規化クラスの使い方は「PHPで日本語テキストを正規化」を参照。include_path が通ったディレクトリに配置すること。 |
バージョン | 更新日 | 内容 |
---|---|---|
1.1.0 | 2024/05/18 | Chrome, Edgeで隣り合う元号が重なる不具合を修正 |
1.0 | 2019/05/02 | 初版 |
バージョン | 更新日 | 内容 |
---|---|---|
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: }
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は効かないようだ)
参考情報
日本の大化から令和までの歴代元号を時刻表っぽくしてみました。 pic.twitter.com/RaUSfQ7Vbl
— オ(端) (@Y_Hayama01) 2019年5月2日
参考サイト
- PHPで過去の元号を分析する:ぱふぅ家のホームページ
「PHPで過去の元号を分析する」に続き、今回は、大化(645年)から令和(2019年)までのすべての元号を、鉄道時刻表に並べて表示するPHPプログラムを作る。
南北朝時代については、南朝の元号を採用している。クラス pahooNormalizeText には北朝の元号がコメントアウトしてあるので、必要に応じて、南朝と切り替えてみてほしい。
(2024年5月18日)Chrome, Edgeで隣り合う元号が重なる不具合を修正