【DAY.10】php判断18位身份账号码是否正确(基于加权算法)

思路: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";
		}
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值