Hướng dẫn viết ứng dụng kiểm tra năm sinh theo âm lịch bằng PHP

DOWNLOAD DEMO

Như các Bạn đã biết thì năm âm lịch là một trong những nét văn hóa đặc trưng của văn hóa phương đông, rất nhiều sự kiện văn hóa của nước ta vẫn sử dụng lịch âm để tính ví dụ như tết âm lịch, tết trung thu, tết thanh minh .vv..

Trong bài viết này mình sẽ hướng dẫn các bạn viết một ứng dụng kiểm tra năm sinh âm lịch bằng php.

Đề bài: viết ứng dụng gồm 2 ô nhập liệu, một để nhập năm sinh, một để nhập năm muốn kiểm tra. Sau khi bấm nút kiểm tra, chương trình sẽ tìm kiếm các năm đó theo âm lịch và kiểm tra xem hai năm đó thuộc nhóm nào, sẽ có 3 nhóm là: Tam hợp, Tứ hành xung hoặc không kị cũng không hợp. Sau đó kết quả sẽ được trả về màn hình.

Cách giải quyết và thuật toán áp dụng

Đầu tiên, chúng ta cần một form để người dùng nhập dữ liệu, dữ liệu nhận được sẽ là năm sinh và năm kiểm tra theo dương lịch. Ta sẽ tạo một hàm để chuyển năm dương lịch thành âm lịch theo quy tắc 12 con giáp và 10 hàng can cứ sau 10 năm lại quay lại hàng can đầu và sau 12 năm lại quay lại con giáp đầu. Sau khi đã có năm âm lịch, ta sẽ tạo một hàm so sánh mối quan hệ giữa con giáp của năm sinh và năm kiểm tra theo các nhóm:

4 nhóm tam hợp:

  • "Tý", "Thìn", "Thân".
  • Sửu", "Tỵ", "Dậu".
  • "Dần", "Tuất", "Ngọ".
  • "Mão", "Hợi", "Mùi".

3 nhóm tứ hành xung:

  • "Tý", "Mão", "Ngọ", "Dậu".
  • "Sửu", "Thìn", "Mùi", "Tuất".
  • "Dần", "Tỵ", "Thân", "Hợi".

Nếu cả hai cùng thuộc 1 trong 4 nhóm tam hợp thì kết quả là tam hợp, nếu thuộc 1 trong 3 nhóm tứ hành xung thì kết quả là tứ hành xung, nếu không thuộc 1 trong 7 nhóm này thì kết quả là không kị cũng không hợp.

Sau khi đã có kết quả, ta sẽ hiển thị kết quả ra cho ngưới dùng.

OK! vậy giờ ta cùng tiến hành làm nhé.

Giao diện và địng dạng

Tạo file index.php và dán đoạn code sau vào:

Code RUN
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
	<title>Insert title here</title>
	<link rel="stylesheet" type="text/css" href="style.css">
	<style type="text/css">
		* {
			margin: 0px;
			padding: 0px;
		}

		#main {
			margin: 20px auto;
			width:  600px;
			border: 1px solid #999;
			padding: 10px;
		}

		#main  h1 {
			color: red;
			text-align: center;
		}

		#main  div.row{
			margin-top: 20px;
		}

		#main  div.row span{
			display: inline-block;
			width: 255px;
			text-align: right;
		}
		#main div.row input[type=text]{
			padding: 3px 5px;
		}

		#main  div.row input[type=submit]{
			padding: 3px 5px;
			display: block;
			margin: 0px auto 20px auto;
		}
		#result{
			text-align: center;
			color: red;
			font-style: italic;
		}
	</style>
</head>
<body>
	<div id="main">
		<h1>Tra Cứu Năm Tuổi Từ 1960</h1>
		
		<form name="checkage" action="#" method="post">
			<div class="row">
				<span>Năm Sinh :</span>
				<input id="birthday" type="text" name="birthyear" placeholder="Nhập năm sinh của bạn"/>
			</div>
			<div class="row">
				<span>Năm Kiểm Tra :</span>
				<input id="checkyear" type="text" name="checkyear" placeholder="Nhập năm bạn muốn kiểm tra"/>
			</div>
			<div class="row">
				<input type="submit" name="submit" value="Tra Cứu" />
			</div>
			<div id="result">
			</div>
		</form>
		
	</div>
</body>
</html>

Các bạn lưu ý là file index.php chứ không phải index.html nhé, vì mình sẽ viết cả code PHP nữa mà :D.

và đấy là kết quả:

Mình sẽ không giải thích nhiều về phần này vì nó khá đơn giản, chúng ta sẽ tập trung vào phần PHP nhiều hơn.

Viết các hàm xử lý bằng PHP

Ở đây mình sẽ cần 2 hàm xử lý đó là hàm chuyển năm dương lịch thành âm lịchhàm so sánh hai năm âm lịch.

Đầu tiền là hàm chuyển năm dương lịch thành năm âm lịch, các bạn thêm đoạn code sau vào sau thẻ h1:

Code
<?php
	//Hàm lấy năm âm lịch dựa vào năm dương lịch
	function getlunaryear($year){
		//mảng các con giáp
		$animal		= array(
				"Tý",
				"Sửu",
				"Dần",
				"Mão",
				"Thìn",
				"Tị",
				"Ngọ",
				"Mùi",
				"Thân",
				"Dậu",
				"Tuất",
				"Hợi"
		);
		//mảng các hàng can
		$hangcan	= array(
				"Canh",
				"Tân",
				"Nhâm",
				"Quý",
				"Giáp",
				"Ất",
				"Bính",
				"Đinh",
				"Mậu",
				"Kỷ",
		);
		//tạo biến kết quả
		$result	= "";
		//lấy hàng can
		$last	=	substr($year, 3, 1);
		for ($i = 0; $i < 10; $i++) {
			if ($last == $i) {
				$result	= $hangcan[$i];
				break;
			}
		}
		//lấy con giáp và nối vào biến kết quả
		$n	= ($year - 1960) % 12;
		for ($i = 0; $i < 13; $i++) {
			if ($n == $i) {
				$result	.=" $animal[$i]";
				break;
			}
		}
		return $result;
	}
?>

Ở đây, do hàng can 10 năm sẽ lặp lại một lần và bắt đầu từ 0 nên khá đơn giản, mình sẽ lấy số cuối cùng của năm và kiểm tra nó là phần tử thứ mấy trong mảng hàng can ($hangcan).

Lấy con giáp phức tạp hơn một chút, ta sẽ cần một mốc thời gian với con giáp đầu tiên là "", ở đây mình sử dụng 1960, chính vì vậy nên kết quả sẽ chỉ chính xác bạn nhập năm lớn hơn 1960. Bạn có thể sử dụng các năm khác làm mốc tùy ý tuy nhiên chúng phải là năm "Tý". Sau khi đã có năm mốc, bạn xác định thuật toán như sau, con giáp hiện tại sẽ chênh lệch với "Tý" theo công thức : số năm chênh lệch = (năm hiện tại - 1960) % 12.

Ví dụ: 2015 thì số năm chênh lệch = (2015 - 1960) % 12 = 7. coi "Tý" là phần tử 0 nhất thì phần tử thứ 7 trong mảng $animal sẽ là "Mùi", vậy năm 2015 là năm "Mùi".

Sau khi đã lấy được hàng can và con giáp mình chỉ cần nối vào biến $result và return $result.

Tiếp theo chúng ta viết hàm kiểm tra mối quan hệ giữa hai năm âm lịch, các bạn dán đoạn code sau vào sau hàm getlunaryear vừa tạo ở trên:

Code
// //Hàm kiểm tra 2 năm thuộc nhóm nào
function checkyear($year1,$year2) {
	/*cắt năm âm lịch thành mảng bảo gồm hàng can và con giáp */
	$year1			= getlunaryear($year1);
	$arryear1		= explode(" ", $year1);
	//lấy con giáp của năm 1
	$animalOfYear1	= $arryear1[1];
	$year2			= getlunaryear($year2);
	$arryear2		= explode(" ", $year2);
	//lấy con giáp của năm 2
	$animalOfYear2	= $arryear2[1];
	/*Tien hanh kiem tra */
	/*Mảng các nhóm theo con giáp, tứ hành xung và tam hợp */
	$rules	= array(
		"thx"	=> array(
					"1" => array("Tý", "Mão", "Ngọ", "Dậu"),
					"2" => array("Sửu", "Thìn", "Mùi", "Tuất"),
					"3" => array("Dần", "Tỵ", "Thân", "Hợi"),
					),
		"th"	=>array(
					"1" => array("Tý", "Thìn", "Thân"),
					"2" => array("Sửu", "Tỵ", "Dậu"),
					"3" => array("Dần", "Tuất", "Ngọ"),
					"4" => array("Mão", "Hợi", "Mùi"),
					),
	);
	foreach ($rules["thx"] as $group) {
		//Nếu hai con giáp cùng thuộc một trong các nhom tứ hành xung, return kết quả "Thuộc tứ hành xung khắc"
		if (in_array($animalOfYear1, $group) && in_array($animalOfYear2, $group)) {
			return $checkanimal	= "Thuộc Tứ hành xung khắc";
		}
	}
	foreach ($rules["th"] as $group) {
		//Nếu hai con giáp cùng thuộc một trong các nhom tam hợp, return kết quả "Thuộc Tam Hợp"
		if (in_array($animalOfYear1, $group) && in_array($animalOfYear2, $group)) {
			return $checkanimal	= "Thuộc Tam Hợp";
		}
	}
	//Nếu hai con giáp không thuộc nhóm nào, return về "Không kị Cũng không Hợp"
	return $checkanimal	= "Không kị Cũng không Hợp";
	
}

Mình đã giải thích khá kỹ bằng ghi chú, nên mình sẽ không giải thích lại.

Vậy là chúng ta đã có hai hàm cần thiết rồi, bây giờ mình sẽ nhận dự liệu nhập từ người dùng.

Các bạn dán đoạn code dưới đây vào sau hai hàm vừa tạo, đặt ngoài hàm nhé :

Code
$yearOfBirth	= "";
$checkYear	= "";
//Kiểm tra sự tồn tải của biến POST để xem người dùng ấn kiểm tra chưa
if (isset($_POST['birthyear']) && isset($_POST['checkyear'])) {
	if ((is_numeric($_POST['birthyear']) && strlen($_POST['birthyear'])==4) 
		&& (is_numeric($_POST['checkyear']) && strlen($_POST['checkyear'])==4 && 
			$_POST['birthyear'] > 1960 && $_POST['checkyear'] > 1960)){
		$yearOfBirth	= $_POST['birthyear'];
		$checkYear	= $_POST['checkyear'];
		//lấy năm âm lịch 
		$lunarbirthyear	= getlunaryear($yearOfBirth);
		$lunarcheckyear	= getlunaryear($checkYear);
		//Kiểm tra mối quan hệ của chúng
		$checkanimal	= checkyear($yearOfBirth, $checkYear);
		$result	= 'Bạn sinh vào năm '.$lunarbirthyear.', năm kiểm tra là năm '.
		$lunarcheckyear.', '.$lunarbirthyear.' và '.$lunarcheckyear.' '.$checkanimal.'.';
	}else {
			$result	= "giá trị bạn nhập không đúng";
	}
	
}else {
	$result	= "";
}

Đầu tiên mình khai báo hai biến $yearOfBirth và $checkYear null để lưu năm sinh và năm kiểm tra, sau đó kiểm tra nếu người dùng ấn kiểm tra thì mới thực hiện các lệnh.

Khi người dùng đã ấn kiểm tra, mình kiểm tra các điều kiện cho năm sinh và năm kiểm tra, phải là số nguyên, phải là năm đầy đủ gồm 4 chữ số và phải lớn hơn 1960.

Tiếp đến là kiểm tra bằng hàm checkyear() với tham số là $yearOfBirth và $checkYear.

Cuối cùng là gán giá trị vào biến $result.

Như vậy là mình đã hoàn thành các xử lý bằng php, giờ chỉ cần show ra nữa là xong. Các bạn sử lại code html để show ra kết quả nhé:

Code
<form name="checkage" action="#" method="post">
	<div class="row">
		<span>Năm Sinh :</span>
		<input id="birthday" type="text" name="birthyear" 
		value="<?php echo $yearOfBirth ?>" placeholder="Nhập năm sinh của bạn"/>
	</div>
	<div class="row">
		<span>Năm Kiểm Tra :</span>
		<input id="checkyear" type="text" name="checkyear" 
		value="<?php echo $checkYear ?>" placeholder="Nhập năm bạn muốn kiểm tra"/>
	</div>
	<div class="row">
		<input type="submit" name="submit" value="Tra Cứu" />
	</div>
	<div id="result">
		<?php echo $result;?>
	</div>
</form>

Như vậy là xong, giờ chúng ta sẽ được một file hoàn chỉnh như sau:

Code
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<title>Insert title here</title>
		<link rel="stylesheet" type="text/css" href="style.css">
		<style type="text/css">
			* {
				margin: 0px;
				padding: 0px;
			}

			#main {
				margin: 20px auto;
				width:  600px;
				border: 1px solid #999;
				padding: 10px;
			}

			#main  h1 {
				color: red;
				text-align: center;
			}

			#main  div.row{
				margin-top: 20px;
			}

			#main  div.row span{
				display: inline-block;
				width: 255px;
				text-align: right;
			}
			#main div.row input[type=text]{
				padding: 3px 5px;
			}

			#main  div.row input[type=submit]{
				padding: 3px 5px;
				display: block;
				margin: 0px auto 20px auto;
			}
			#result{
				text-align: center;
				color: red;
				font-style: italic;
			}
		</style>
	</head>
	<body>
		<div id="main">
			<h1>Tra Cứu Năm Tuổi Từ 1960</h1>
			<?php
				//Hàm lấy năm âm lịch dựa vào năm dương lịch
				function getlunaryear($year){
					//mảng các con giáp
					$animal		= array(
							"Tý",
							"Sửu",
							"Dần",
							"Mão",
							"Thìn",
							"Tị",
							"Ngọ",
							"Mùi",
							"Thân",
							"Dậu",
							"Tuất",
							"Hợi"
					);
					//mảng các hàng can
					$hangcan	= array(
							"Canh",
							"Tân",
							"Nhâm",
							"Quý",
							"Giáp",
							"Ất",
							"Bính",
							"Đinh",
							"Mậu",
							"Kỷ",
					);
					//tạo biến kết quả
					$result	= "";
					//lấy hàng can
					$last	=	substr($year, 3, 1);
					for ($i = 0; $i < 10; $i++) {
						if ($last == $i) {
							$result	= $hangcan[$i];
							break;
						}
					}
					//lấy con giáp và nối vào biến kết quả
					$n	= ($year - 1960) % 12;
					for ($i = 0; $i < 13; $i++) {
						if ($n == $i) {
							$result	.=" $animal[$i]";
							break;
						}
					}
					return $result;
				}
				// //Hàm kiểm tra 2 năm thuộc nhóm nào
				function checkyear($year1,$year2) {
					/*cắt năm âm lịch thành mảng bảo gồm hàng can và con giáp */
					$year1			= getlunaryear($year1);
					$arryear1		= explode(" ", $year1);
					//lấy con giáp của năm 1
					$animalOfYear1	= $arryear1[1];
					$year2			= getlunaryear($year2);
					$arryear2		= explode(" ", $year2);
					//lấy con giáp của năm 2
					$animalOfYear2	= $arryear2[1];
					/*Tien hanh kiem tra */
					/*Mảng các nhóm theo con giáp, tứ hành xung và tam hợp */
					$rules	= array(
						"thx"	=> array(
									"1" => array("Tý", "Mão", "Ngọ", "Dậu"),
									"2" => array("Sửu", "Thìn", "Mùi", "Tuất"),
									"3" => array("Dần", "Tỵ", "Thân", "Hợi"),
									),
						"th"	=>array(
									"1" => array("Tý", "Thìn", "Thân"),
									"2" => array("Sửu", "Tỵ", "Dậu"),
									"3" => array("Dần", "Tuất", "Ngọ"),
									"4" => array("Mão", "Hợi", "Mùi"),
									),
					);
					foreach ($rules["thx"] as $group) {
						//Nếu hai con giáp cùng thuộc một trong các nhom tứ hành xung, return kết quả "Thuộc tứ hành xung khắc"
						if (in_array($animalOfYear1, $group) && in_array($animalOfYear2, $group)) {
							return $checkanimal	= "Thuộc Tứ hành xung khắc";
						}
					}
					foreach ($rules["th"] as $group) {
						//Nếu hai con giáp cùng thuộc một trong các nhom tam hợp, return kết quả "Thuộc Tam Hợp"
						if (in_array($animalOfYear1, $group) && in_array($animalOfYear2, $group)) {
							return $checkanimal	= "Thuộc Tam Hợp";
						}
					}
					//Nếu hai con giáp không thuộc nhóm nào, return về "Không kị Cũng không Hợp"
					return $checkanimal	= "Không kị Cũng không Hợp";
					
				}

				$yearOfBirth	= "";
				$checkYear	= "";
				//Kiểm tra sự tồn tải của biến POST để xem người dùng ấn kiểm tra chưa
				if (isset($_POST['birthyear']) && isset($_POST['checkyear'])) {
					if ((is_numeric($_POST['birthyear']) && strlen($_POST['birthyear'])==4) 
						&& (is_numeric($_POST['checkyear']) && strlen($_POST['checkyear'])==4 && 
							$_POST['birthyear'] > 1960 && $_POST['checkyear'] > 1960)){
						$yearOfBirth	= $_POST['birthyear'];
						$checkYear	= $_POST['checkyear'];
						//lấy năm âm lịch 
						$lunarbirthyear	= getlunaryear($yearOfBirth);
						$lunarcheckyear	= getlunaryear($checkYear);
						//Kiểm tra mối quan hệ của chúng
						$checkanimal	= checkyear($yearOfBirth, $checkYear);
						$result	= 'Bạn sinh vào năm '.$lunarbirthyear.', năm kiểm tra là năm '.
						$lunarcheckyear.', '.$lunarbirthyear.' và '.$lunarcheckyear.' '.$checkanimal.'.';
					}else {
							$result	= "giá trị bạn nhập không đúng";
					}
					
				}else {
					$result	= "";
				}
			?>
			
			<form name="checkage" action="#" method="post">
				<div class="row">
					<span>Năm Sinh :</span>
					<input id="birthday" type="text" name="birthyear" 
					value="<?php echo $yearOfBirth ?>" placeholder="Nhập năm sinh của bạn"/>
				</div>
				<div class="row">
					<span>Năm Kiểm Tra :</span>
					<input id="checkyear" type="text" name="checkyear" 
					value="<?php echo $checkYear ?>" placeholder="Nhập năm bạn muốn kiểm tra"/>
				</div>
				<div class="row">
					<input type="submit" name="submit" value="Tra Cứu" />
				</div>
				<div id="result">
					<?php echo $result;?>
				</div>
			</form>
			
		</div>
	</body>
</html>

Trên đây là bài hướng dẫn cách  tạo ứng dụng kiểm tra năm sinh âm lịch của mình, qua ứng dụng đơn giản này chúng ta đã ôn lại được các kiến thức về PHP. Nếu có thắc mắc gì các bạn có thể comment ở bên dưới. Hẹn gặp lại các bạn trong các bài viết tiếp theo.

-------------------#####-------------------

Khóa học nên xem

Nguồn: freetuts.net