民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
校验码的计算方法:
1、将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。
2、将这17位数字和系数相乘的结果相加。
3、用加出来和除以11,看余数是多少?
4、余数只可能有0-1-2-3-4-5-6-7-8-9-10这11个数字。其分别对应的最后一位身份证的号码为1-0-X -9-8-7-6-5-4-3-2。
判断身份证号是否正确的函数如下:
function validIdCard($idCard) {
if (strlen($idCard) != 18) {
return false;
}
$coefficient = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]; //前17位对应的系数
$remainderArr = ['1', '0', 'X', '9', '8', '7', '6' ,'5' ,'4', '3', '2']; //余数对应的最后一位
$sum = 0; //前17位乘以系数后的和
for ($i = 0; $i < 17; $i++) {
$tmp = substr($idCard, $i, 1);
$sum += intval($tmp) * $coefficient[$i];
}
$remainder = $sum % 11;
if ($remainderArr[$remainder] == substr($idCard, 17, 1)) {
return true;
} else {
return false;
}
}