ซอร์สโค๊ดในบทความนี้จะแบ่งเป็น 2 ไฟล์นะครับ
โดยจะแยกไฟล์ที่เก็บคลาสออกจาก ส่วนที่ใช้แสดงผล ดังนี้
สร้างไฟล์สำหรับเก็บคลาสชื่อ birthday_process.php
<?php
Class BirthdayProcess{
private $birthday;
public $age_year;
public $age_month;
/**
* @param $date Array ส่งข้อมูลชุดที่ต้องการคำนวณมาในคลาส
*/
public function __construct($date)
{
$this->birthday = $date; //yyyy-mm-dd
}
/**
* หาค่าอายุจากวันเกิด โดยจะใช้หลักการนับตามปฏิทิน
* @return Object จะได้ค่า age_year, age_month, age_day
*/
public function process_age()
{
$dte = explode('-', $this->birthday); //yyyy-mm-dd
$time = strtotime($this->birthday);
//จำนวนเดือน
$mon = ($dte[1] >= date('m') ? 12 - ($dte[1] - date('m')) : date('m') - $dte[1]);
//หาจำนวนปี และคำนวณเดือนใหม่ กรณีที่ยังไม่เต็มเดือน
if(date("md") < "$dte[1]$dte[2]"){ //ยังไม่ถึงวันเกิด
$age = ((date("Y") - $dte[0]) - 1); //ต้อง ลดปีลงหนึ่ง
if(date("d") < "$dte[2]") $mon--; //ถ้า วันที่ปัจจุบัน น้อยกว่าวันที่เกิด แสดงว่ายังไม่เต็มเดือน ให้ลดตัวเลขเดือน ลงหนึ่ง
}else{// เดือนวัน เลยเดือนวันเกิด
$age = (date("Y") - $dte[0]); //ไม่ต้องลดปี เพราะถึงวันเกิดแล้ว
if($mon >= 12) $mon = 0; //ถ้าเกิน 12 เดือน ให้กำหนดเป็น 0
if(date("d") < "$dte[2]") $mon--; //ถ้าวันที่ปัจจุบัน น้อยกว่าวันที่เกิด แสดงว่ายังไม่เต็มเดือน ให้ลดตัวเลขเดือน ลงหนึ่ง
}
//หาจำนวนวัน
if(date("d") < "$dte[2]"){ //ถ้าวันปัจจุบัน น้อยกว่าวันเกิด (คือข้ามเดือนใหม่)
$last_day = date('t', strtotime("-1 month")); //หาตัวเลขวันที่ล่าสุดในปฏิทินของเดือนที่ผ่านมา
if($last_day > $dte[2]){ //ถ้าวันสุดท้ายของเดือน มากกว่าวันเกิด
$day = ($last_day - $dte[2]) + date('j'); //เอาค่าวันที่ที่เหลือ ของเดือนก่อนหน้า มารวมกับวันที่ในเดือนปัจจุบัน
}else{ //ถ้าไม่มากกว่า ก็แสดงว่าวันเกิดอยู่วันสดท้าย หรือเดือนนั้นวันที่น้อยกว่าวันเกิด
$day = date('j'); //ก็นับวันปัจจุบันไปเลย ไม่ต้องบวกเพิ่ม
}
}else{ //วันที่ เลยวันเกิดไปแล้ว แสดงว่าอยู่ช่วงสิ้นเดือน
$day = date('d') - $dte[2]; //ให้เอาวันที่ - วันเกิดไปเลย จะได้ส่วนต่างเป็นจำนวนวัน
}
$this->age_year = $age;
$this->age_month = $mon;
$this->age_day = $day;
}
/**
* หาปีที่เกษียณอายุ โดยกำหนดให้เป็นสิ้นเดือนกันยายนของปีนั้นๆ
* @return String คืนค่าวันที่เกษียณอายุ
*/
public function get_retire()
{
$age = _RETIRE_YEAR; //รับค่าอายุที่จะเกษียณ
if(substr($this->birthday, 5, 2) >= 10) $age += 1;// ถ้าเลยปีงบประมาณแล้ว ให้ไปอยู่ในปีข้างหน้า
$date_retire = (substr($this->birthday, 0, 4) + $age) . "-09-30"; //สิ้นปีงบประมาณ หน่วยงานราชการ
return $date_retire;
}
/**
* ตรวจสอบอายุว่ามากกว่าเกณฑ์ที่กำหนดแล้วหรือยัง
* @return Boolean คืนค่าเป็นจริงเมื่ออายุผ่านเกณฑ์
*/
public function validate_age($age = 18)
{
$time_allow = strtotime("+$age years", strtotime($this->birthday));
return (time() > $time_allow);//ถ้าวันปัจจุบัน มากกว่าวันที่ครับเกณฑ์ จะคือค่าเป็น จริง
}
/**
* เปลี่ยนรูปแบบวันที่ให้มีเครื่องหมาย / และเป็นปี พ.ศ.
*/
public function set_thai_date($string)
{
$arr = explode("-", $string);
return $arr[2].'/'.$arr[1].'/'.($arr[0]+543);
}
}
/* END OF Class BirthdayProcess */
?>
สำหรับส่วนที่สองจะใช้สำหรับแสดงผล โดยจะเรียกคลาสจะไฟล์ birthday_process.php มาใช้งานอีกที โค๊ดดังนี้
<?php
/* ---- โหลดคลาสที่ต้องการใช้งาน ---- */
include 'classes/birthday_process.php';
/* ---- เตรียมข้อมูลสำหรับเรียกใช้ ---- */
define('_RETIRE_YEAR', 60); //อายุที่เกษียณ
$valid_age = 18; //ตรวจสอบอายุ
/* ---- ประมวลผลข้อมูล ตามวันที่ที่ส่งเข้ามา ---- */
$date = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d');//วันที่ ที่ต้องการดูข้อมูล
$obj = new BirthdayProcess($date);
$obj->process_age();
$retire_date = $obj->set_thai_date($obj->get_retire());
$age_validate_msg = "";
if($obj->validate_age($valid_age) == false){
$age_validate_msg = "<font color='red'>อายุยังไม่ครบ $valid_age ปี</font>";
}else{
$age_validate_msg = "อายุครบ $valid_age ปีบริบูรณ์";
}
?>
<!DOCTYPE html>
<html>
<head>
<title>การเขียนโปรแกรม PHP ประมวลผลข้อมูลต่างๆ จากวันเดือนปีเกิด</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
.year{ color : blue;}
.month{ color : orange;}
.day{ color : red;}
.data{ color : blue;}
table{
border-collapse: collapse;
}
td{ border: 1px solid #cccccc; }
</style>
</head>
<body>
<div style="padding : 10px">
เลือกวันที่ =>
| <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1985-08-28">1985-08-28</a>
| <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1985-10-12">1985-10-12</a>
| <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1986-02-09">1986-02-09</a>
| <a href="<?php echo $_SERVER['PHP_SELF'];?>?date=1998-06-07">1998-06-07</a> |
</div>
<div style="clear:both"/>
<div id="content" style="border: 2px solid #cccccc; float: left; padding : 20px">
<h1>การเขียนโปรแกรม PHP <br/>ประมวลผลข้อมูลต่างๆ จากวันเดือนปีเกิด
<br/><font color="blue"><?php echo $date;?></font></h1>
<table width="500">
<tr>
<td>อายุ </td>
<td>
<span class="year"><?php echo $obj->age_year;?></span> ปี
<span class="month"><?php echo $obj->age_month;?></span> เดือน
<span class="day"><?php echo $obj->age_day;?></span> วัน
</td>
</tr>
<tr>
<td>วันที่เกษียณอายุ </td>
<td><span class="data"><?php echo $retire_date;?></span> </td>
</tr>
<tr>
<td>ตรวจสอบอายุ </td>
<td><span class="data"><?php echo $age_validate_msg;?></span> </td>
</tr>
</table>
</div>
<br/>
</body>
</html>
ปล. ถ้าเจอบั๊กรบกวนแจ้งกันด้วยนะครับ เพราะขั้นตอนการนับอายุจะใช้วิธีนับจำนวนวันตามตารางปฏิทินไปเลย โดยพยายามตรวจจับทุกกรณีที่มีผลให้ยอดคำนวณเลื่อนเดือนปีไปแล้ว และทดสอบดูโดยการรันวันที่ไปเรื่อยๆ ก็ยังได้ข้อมูลที่ถูกต้องครับ
"PHP ไม่ได้สร้างสุดยอดโปรแกรมแต่ PHP ช่วยให้งานคุณง่ายขึ้นต่างหาก"
PHP CI MANIA - PHP Code Generatorโปรแกรมช่วยสร้างโค้ด ลดเวลาการเขียนโปรแกรม
สนใจสั่งซื้อเพียง 3,990 บาท
PHP CI MANIA - PHP Code Generator
โปรแกรมช่วยสร้างโค้ด "ลดเวลาการเขียนโปรแกรม"
เปลี่ยนฟอนต์เถอะครับ ตาลายเลยบทความเนื้อหามีเยอะเเละน่าสนใจดี เเต่อ่านยากมากเเละมั่วกับฟอนต์ทีครุขระไปมาเล็กใหญ่ เอียงมังตรงมังสลับเปนรายตัวเเบบนี้อ่านนานๆอ้วกได้เลยครับ
ตอบลบขอบคุณสำหรับข้อเสนอแนะครับ
ลบ