PHP 3カ月カレンダーコマンドライン

Windows で Linuxシェルコマンドが使える busybox を入れたので、cal コマンドを試していて、3カ月カレンダーにしてみたくなり、作ってみました。

Windowsでは、busybox をインストールする必要あります。
Linux は calコマンドを素直に使ってます。

[ コード例 ]


<?php

/**
 * 横並び3カ月カレンダーテキスト取得
 * argv : なし
 * Update : 2019-01-22
 * Author : H.Tanaka
 */

$nowy = (int)date("Y");
$nowm = (int)date("m");

$m0 = $nowm - 1;
$m1 = $nowm;
$m2 = $nowm + 1;

$y0 = $m0 == 0 ? $nowy - 1 : $ynowy;
$y1 = $nowy;
$y2 = $m2 == 13 ? $nowy + 1 : $nowy;

$m0 = $m0 == 0 ? 12 : $m0;
$m2 = $m2 == 13 ? 1 : $m2;

$yary = [$y0, $y1, $y2];
$mary = [$m0, $m1, $m2];


$cmd = "";
if (DIRECTORY_SEPARATOR == "/") {   // Linux
  $cmd = "cal";
}
else {                              // Windows
  $cmd = "busybox64 cal";
}

$pos = 0;
$restxtary = [];
foreach ($mary as $m) {
  
  $y = $yary[$pos];
  $ccmd = $cmd." ".$m." ".$y;
  //echo $ccmd."\n";
  
  $resrows = [];    // ここで初期化しないと前月に追加される
  exec($ccmd, $resrows);
  $restxtary[] = $resrows;
  
  $pos++;
  
}
//var_dump($restxtary);

// 横並び3カ月カレンダー //
$calentxt = "";
for ($i = 0; $i<8; $i++ ) {
  for ($j = 0; $j<3; $j++ ) {
    $tmp = str_pad($restxtary[$j][$i], 20). "   ";
    $calentxt .= $tmp;
  }
  $calentxt .= "\n";
}

echo $calentxt;

?>


[ 実行結果 ]

c:\phppathname>php CalText3MH.php
   December 2018           January 2019          February 2019
Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa   Su Mo Tu We Th Fr Sa
                   1          1  2  3  4  5                   1  2
 2  3  4  5  6  7  8    6  7  8  9 10 11 12    3  4  5  6  7  8  9
 9 10 11 12 13 14 15   13 14 15 16 17 18 19   10 11 12 13 14 15 16
16 17 18 19 20 21 22   20 21 22 23 24 25 26   17 18 19 20 21 22 23
23 24 25 26 27 28 29   27 28 29 30 31         24 25 26 27 28
30 31

busybox はこちら : https://busybox.net/about.html

[ 応用例 ]

GD を使って画像に書き込んでみる。