PHP实现15位身份证号转18位的方法分析
在国家实行全民身份证制度之前,早期颁发的身份证都只有15位号码,这些15位身份证号的最后一位校验码是随机生成的。在现在的全民身份证制度下,身份证号码都是18位,其中最后一位是通过前17位号码计算得出的校验码。对于一些老旧的记录系统或早期数据采集结果,需要将15位身份证号转换成18位,这就需要用到身份证号码的规则。
身份证号码规则
一、身份证号码结构
每位身份证号码的含义如下:
1-2位:表示省份,例如:11代表北京市;43代表湖南省。
3-4位:表示市区,例如:010代表北京市;0731代表湖南省长沙市。
5-6位:表示区县,例如:110101代表北京市东城区;430903代表湖南省湘潭市湘潭县。
7-14位:表示出生年月日。
15-17位:表示顺序,其中17位男性为单数,女性为双数;最后一位为校验码。
二、身份证号码校验规则
-
将身份证号码前17位数字分别乘以不同的系数,系数分别为:7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2。
-
将得到的乘积相加后,除以11取余数。
-
根据余数,找到对应的校验码:0、1、2、3、4、5、6、7、8、9、10对应的校验码分别为:1、0、X、9、8、7、6、5、4、3、2。
-
将身份证号码第18位设置为校验码。
PHP实现15位身份证号转换成18位的方法
- 基本思路
将15位身份证号码转换成18位,需要先在原身份证号码后面加上2位数字表示“19”(如果出生日期在2000年前)或“20”(如果出生日期在2000年后),再计算并添加得出的18位校验码。
- 代码实现
下面是利用PHP实现将15位身份证号码转换成18位的代码示例:
function idcard_15to18($idcard){
if(strlen($idcard)!=15){
return false;
}else{
$result=[];
$idcard_base=substr($idcard,0,6).'19'.substr($idcard,6,9);
$sum=0;
for($i=0;$i<17;$i++){
$sum += (int)($idcard_base{$i}) * pow(2,17-$i)%11;
}
$check_code=['1','0','X','9','8','7','6','5','4','3','2'];
array_push($result,$idcard_base.$check_code[$sum%11]);
return $result[0];
}
}
// 15位身份证号码转18位示例
$idcard='320922800801010';
echo idcard_15to18($idcard) // 将输出320922198008010018
// 非15位身份证号码转18位示例
$idcard='320922198008010018';
echo idcard_15to18($idcard) // 将输出false
代码解析:
(1) 第1行定义一个函数idcard_15to18(),用于将15位身份证号码转换成18位。
(2) 第2行判断传入的身份证号码长度是否为15,如果不是则返回false。
(3) 第4行新建一个数组$reuslt,存放执行结果。
(4) 第5行将15位身份证号码中的前6位和后9位拆分出来,中间再加上”19”(表示出生年份在1900年后且在2000年前)。
(5) 第6-12行计算新的18位身份证号码的17位校验码,重点代码是第8行,$sum的计算式为每位身份证号码的系数相乘再求和,其中17-$i表示身份证号码从左到右的位数,pow(2,17-$i)%11表示系数的计算公式,%11是为了取余数。
(6) 第13行将计算出来的18位身份证号码和17位校验码结合起来,以字符串形式返回。
- 总结
通过上面的代码示例,我们可以看到,将15位身份证号转换成18位可以利用身份证号码结构和校验规则,通过代码实现一定的计算和拼接。在实际场景中,如果需要批量转换很多身份证号码,可以将这段代码封装成一个函数或者工具类以供调用,简化操作流程,增强程序的可维护性和可读性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现15位身份证号转18位的方法分析 - Python技术站