share facebook facebook twitter menu hatena pocket slack

2011.12.09 FRI

PHPで生年月日からその人の現在の学年を算出する

櫛田 草平

WRITTEN BY 櫛田 草平

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

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

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

$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)が書いています。

櫛田 草平

櫛田 草平

cloudpackで運用、保守、構築、夜間対応を担当しており、日々様々な課題に対応していますのでこの経験を記事にしていけたらと思います。 櫛田 草平

cloudpack

cloudpackは、Amazon EC2やAmazon S3をはじめとするAWSの各種プロダクトを利用する際の、導入・設計から運用保守を含んだフルマネージドのサービスを提供し、バックアップや24時間365日の監視/障害対応、技術的な問い合わせに対するサポートなどを行っております。
AWS上のインフラ構築およびAWSを活用したシステム開発など、案件のご相談はcloudpack.jpよりご連絡ください。