思路:18位身份证号码,前17位配合加权因子加权求和,在通过取模11,获取校验码所在的key,最后匹配第18位与所取得的key是否相符,来判断是否符合
注意点:函数录入变量时,如果类型为整形,php为自动转化为浮点型,造成后面操作错误
源码
function isIdcard($number){
//如果变量输入为数字,会自动转化为浮点型,下面操作也就无意义了
if(gettype($number) != 'string'){
echo '请以字符串的方式输入';
return;
}
//如果有x,转化为大写X
$number = strtoupper($number);
//加权因子
$weight = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
//校验码
$check = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
//初始化加权和
$sum = 0;
//计算前17位加权和
for($i=0;$i<17;$i++){
$sum += (int)$number[$i]*$weight[$i];
}
//加权和取模11,结果就是校验码的key
$checKey = $sum % 11;
//判断身份证第18位是否与取得的校验码相符
if($number[17] == $check[$checKey]){
echo "right";
}else{
echo "false";
}
}