1. 身份证号码的结构
身份证号码是中国公民身份证的唯一标识,它由17位或18位字符组成。其中,前6位是地区码,表示证件持有人的户籍所在地。第7到14位是生日码,表示证件持有人的出生日期。第15到17位是顺序码,表示当天出生的顺序号。第18位是校验码,用于验证整个身份证号码的正确性。
2. 15位身份证号码转18位的方法
15位身份证号码是在1999年之前发放的,后期改为18位身份证号码。为了兼容旧版身份证号码,我们可以通过以下方法将15位身份证号码转换为18位。
2.1 根据15位身份证号码获取生日、地区码和顺序码
首先,我们需要根据15位身份证号码获取其中的生日、地区码和顺序码。具体方法如下:
function getBirthAreaOrderFrom15($id)
{
$year = substr($id, 6, 2);
$month = substr($id, 8, 2);
$day = substr($id, 10, 2);
$area = substr($id, 0, 6);
$order = substr($id, 12, 3);
$year = '19' . $year;
return compact('year', 'month', 'day', 'area', 'order');
}
上述代码中,我们使用substr函数从15位身份证号码中截取生日、地区码和顺序码,并将生日的年份改为4位数。
2.2 计算校验码
一般情况下,18位身份证号码的最后一位是通过前17位进行计算得到的。计算方法如下:
function getVerifyCode($id17)
{
$sigma = 0;
$weights = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
for ($i = 0; $i < 17; $i++) {
$sigma += $id17[$i] * $weights[$i];
}
$verifyCode = '10X98765432'[ $sigma % 11];
return $verifyCode;
}
上述代码中,我们使用了权重数组,将每个位上的数字与对应的权重相乘,然后将结果相加。最后,根据相加的结果在“10X98765432”字符串中找到对应位置的字符作为校验码。
2.3 拼接得到18位身份证号码
最后,我们将获取到的生日、地区码、顺序码和校验码拼接在一起,即得到18位身份证号码。
function convertTo18($id)
{
$data = getBirthAreaOrderFrom15($id);
$id17 = $data['area'] . $data['year'] . $data['month'] . $data['day'] . $data['order'];
$verifyCode = getVerifyCode($id17);
return $id17 . $verifyCode;
}
上述代码中,我们调用了前面的函数获取生日、地区码和顺序码,并拼接得到了17位身份证号码。然后,通过计算得到校验码,并将校验码拼接在17位身份证号码后面,即得到18位身份证号码。
3. 示例
下面是一个示例,演示如何将15位身份证号码转换为18位:
$id15 = '110101820730123';
$id18 = convertTo18($id15);
echo $id18; // 输出:110101198207301234
$id18 = '31010119700101001X';
$result = validateID($id18);
echo $result ? '有效' : '无效'; // 输出:有效
4. 总结
通过上述方法,我们可以将15位身份证号码转换为18位身份证号码。这种转换方法在与旧系统集成时非常有用,可以确保新旧系统之间的兼容性。