PHP实现15位身份证号转18位的方法分析

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位身份证号码。这种转换方法在与旧系统集成时非常有用,可以确保新旧系统之间的兼容性。

后端开发标签