ทฤษฎีการออกแบบ ตามการออกแบบเลขที่บัตรประชาชนนั้น จะมีเลขหลักสุดท้ายเป็นตัวเช็คความถูกต้อง (Parition digit) โดยการคำนวณก็เพียงเอาเลขทั้ง 12 หลัก (2-13) คูณด้วยเลขประจำหลัก แล้วหารเอาเศษด้วย 11 เอาผลที่ได้ไปลบออกจาก 11 เลขหลักหน่วยที่ได้จะเป็นเลข Parition digit หรือเลขหลักสุดท้ายนั่นเอง
ในบทความนี้จำเป็นต้องมีการแยกตัวเลขออกมาเป็นเลขแต่ละหลัก เราอาจจะมองเลขทั้งหมดเป็น array ของ character ก็ได้ แต่ในที่นี้เราจะใช้ preg_match เพื่อการแยกหลักของตัวเลขแต่ละตัว และ preg_match ยังช่วยเราในการตรวจสอบ (Validation) ข้อมูลที่เข้ามาว่าเป็นเลขจำนวน 13 หลักหรือไม่
<?จากโค๊ดนี้เราจะได้เลขทั้ง 12 หลักคูณกับเลขประจำหลัก ต่อไปคือการเอาค่าที่ได้ไปหารด้วย 11 และเอาผลลัพธ์ไปลบออกจาก 11
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;
}
?>
$par = 11-($val%11); //เอาค่าไปลบออกจาก 11 และเอาผลลัพธ์ไปลบออกจาก 11
ที่นี้ก็เอาไปเทียบว่าตรงกับหลักสุดท้ายหรือไม่
return $par==$matches[13];
แต่จะมีปัญหาในกรณีที่ $par ที่ได้มีค่ามากกว่า 9 หรือเป็นเลข 2 หลักให้เอาเฉพาะหลักสุดท้าย เราสามารถหาได้ด้วย
while($par>9){ $par %= 10; }
เป็น trick ในการหาเพียงเลขหลัดสุดท้ายครับ เท่านี้เราก็สามารถตรวจสอบว่าเลขบัตรประชาชนนนั้นถูกต้องตามรูปแบบหรือไม่ครับ
หรือสามารถใช้บริการตรวจสอบได้ที่ ตรวจสอบเลขที่บัตรประชาชน