こんにちは。
職人見習いの高嶋です。

生年月日からその人の現在の年齢を算出するケースはよくありますが、現在の学年を算出する必要に迫られ、少し困りました。

まず前提として以下の連想配列が定義されているとします。

$gakunenArray = array(
 0  => '0~1歳児',
 1  => '1~2歳児',
 2  => '2~3歳児',
 3  => '3~4歳児',
 4  => '4~5歳児',
 5  => '5~6歳児',
 6  => '小学1年生',
 7  => '小学2年生',
 8  => '小学3年生',
 9  => '小学4年生',
 10 => '小学5年生',
 11 => '小学6年生',
 12 => '中学1年生',
 13 => '中学2年生',
 14 => '中学3年生',
 15 => '高校1年生',
 16 => '高校2年生',
 17 => '高校3年生',
 18 => '大学1回生',
 19 => '大学2回生',
 20 => '大学3回生',
 21 => '大学4回生',
);

その上である人の生年月日から上記の学年キーを導き出すというものです。

気をつけなければいけないのが以下の2点です。

  • 学年としての年度は4/1~3/31までである。
  • しかし4/1生まれは1学年上である。

それを踏まえた上でメソッドを作ってみました。

function gfGetAgeAndGakunen($birthday, $gakunen_difference = 0)
{
 // 本日
 $t_y = date('Y');
 $t_m = date('m');
 $t_d = date('d');

 // 誕生日
 list($b_y, $b_m, $b_d) = preg_split("/-|/| /", $birthday);

 $t_md = intval( sprintf("%02d%02d", $t_m, $t_d) );
 $b_md = intval( sprintf("%02d%02d", $b_m, $b_d) );

 //-----年齢の計算
 $age = $t_y - $b_y;
 if($t_m * 100 + $t_d  {
  $age--;
 }

 //-----学年の計算
 $gakunen = $age;
 if( $t_md >= 401 ) // 本日が4/1~12/31の場合
 {
  if( $b_md >= 402 ) // 誕生日が4/2~12/31の場合
  {
   if( $t_md >= $b_md ) $gakunen--; // 今年度、既に誕生日を迎えていれば年齢-1が学年
  }
 }
 else // 本日が1/1~3/31の場合
 {
  if( $b_md >= 402 ) // 誕生日が4/2~12/31の場合
  {
   $gakunen--; // 今年度は既に誕生日を迎えているので、年齢-1が学年
  }
  else // 誕生日が1/1~4/1の場合
  {
   if( $t_md >= $b_md ) $gakunen--; // 今年度、既に誕生日を迎えていれば年齢-1が学年
  }
 }

 // 留年や飛び級計算
 $gakunen += $gakunen_difference;

 return array($age, $gakunen);
}

メソッドの第1引数に『yyyy/mm/dd』の誕生日を、
第2引数には1年留年生なら『-1』、1年飛び級生なら『1』を渡します。
基本は『0』です。

※この記事は、なかの人(piro556)が書いています。