เลขที่บัตรประชาชนนั้นเป็นเลขประจำตัวบุคคลซึ่งบ่งบอกจังหวัดและอำเภอที่กำเนิด, เลขที่ประจำตัวบุคคลภายในจังหวัด และเลขตรวจสอบความถูกต้อง เนื่องจากเลขที่ประจำตัวประชาชนไม่ใช่เลข running number ทั่วไปเพื่อความถูกต้องเราสามารถตรวจสอบได้โดยการเขียนฟังก์ชั่นตรวจสอบ
ทฤษฎีการออกแบบ ตามการออกแบบเลขที่บัตรประชาชนนั้น จะมีเลขหลักสุดท้ายเป็นตัวเช็คความถูกต้อง (Parition digit) โดยการคำนวณก็เพียงเอาเลขทั้ง 12 หลัก (2-13) คูณด้วยเลขประจำหลัก แล้วหารเอาเศษด้วย 11 เอาผลที่ได้ไปลบออกจาก 11 เลขหลักหน่วยที่ได้จะเป็นเลข Parition digit หรือเลขหลักสุดท้ายนั่นเอง
ในบทความนี้จำเป็นต้องมีการแยกตัวเลขออกมาเป็นเลขแต่ละหลัก เราอาจจะมองเลขทั้งหมดเป็น array ของ character ก็ได้ แต่ในที่นี้เราจะใช้ preg_match เพื่อการแยกหลักของตัวเลขแต่ละตัว และ preg_match ยังช่วยเราในการตรวจสอบ (Validation) ข้อมูลที่เข้ามาว่าเป็นเลขจำนวน 13 หลักหรือไม่
PHP
<?
function checkid($id){
if(@
preg_match("/^(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)(
\d)$/", $id, $matches)){
//ใช้ preg_match เพื่อตรวจสอบและแยกเลขออกเป็น 13 หลัก
$val = 0;
for($i = 13; $i > 1; $i--){
//ทำการวน loop เพื่อทำการคำนวน
echo $matches[14-$i]."*".$i."=".$i*$matches[14-$i]."
\n";
$val += $i*$matches[14-$i];
}
}else{
return
false;
}
จากโค๊ดนี้เราจะได้เลขทั้ง 12 หลักคูณกับเลขประจำหลัก ต่อไปคือการเอาค่าที่ได้ไปหารด้วย 11 และเอาผลลัพธ์ไปลบออกจาก 11
PHP
$par = 11-($val%11); //เอาค่าไปลบออกจาก 11 และเอาผลลัพธ์ไปลบออกจาก 11
ที่นี้ก็เอาไปเทียบว่าตรงกับหลักสุดท้ายหรือไม่
PHP
return $par==$matches[13];
แต่จะมีปัญหาในกรณีที่ $par ที่ได้มีค่ามากกว่า 9 หรือเป็นเลข 2 หลักให้เอาเฉพาะหลักสุดท้าย เราสามารถหาได้ด้วย
PHP
while($par>9){ $par %= 10; }
เป็น trick ในการหาเพียงเลขหลัดสุดท้ายครับ เท่านี้เราก็สามารถตรวจสอบว่าเลขบัตรประชาชนนนั้นถูกต้องตามรูปแบบหรือไม่ครับ
หรือสามารถใช้บริการตรวจสอบได้ที่
ตรวจสอบเลขที่บัตรประชาชน
ที่มา :http://articles.modoeye.com/Design_and_Development/PHP/การตรวจสอบเลขที่บัตรประชาชน.html