1
// 计算身份证校验码,根据国家标准GB 11643-1999
2 function idcard_verify_number($idcard_base){
3 if (strlen($idcard_base) != 17){ return false; }
4
5 // 加权因子
6 $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
7
8 // 校验码对应值
9 $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
10
11 $checksum = 0;
12 for ($i = 0; $i < strlen ($idcard_base); $i++){
13 $checksum + = substr($idcard_base, $i, 1) * $factor[$i];
14 }
15
16 $mod = $checksum % 11;
17 $verify_number = $verify_number_list[$mod];
18
19 return $verify_number;
20
21 }
22
23 // 将15位身份证升级到18位
24 function idcard_15to18($idcard){
25 if (strlen($idcard) ! = 15){
26 return false;
27 }else{
28 // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
29 if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) ! == false){
30 $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
31 }else{
32 $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
33 }
34 }
35
36 $idcard = $idcard . idcard_verify_number($idcard);
37
38 return $idcard;
39 }
40
41 // 18位身份证校验码有效性检查
42 function idcard_checksum18($idcard){
43 if (strlen($idcard) ! = 18){ return false; }
44 $idcard_base = substr($idcard, 0, 17);
45
46 if (idcard_verify_number($idcard_base) ! = strtoupper(substr($idcard, 17, 1))){
47 return false;
48 }else{
49 return true;
50 }
51 }
52
53
2 function idcard_verify_number($idcard_base){
3 if (strlen($idcard_base) != 17){ return false; }
4
5 // 加权因子
6 $factor = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
7
8 // 校验码对应值
9 $verify_number_list = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
10
11 $checksum = 0;
12 for ($i = 0; $i < strlen ($idcard_base); $i++){
13 $checksum + = substr($idcard_base, $i, 1) * $factor[$i];
14 }
15
16 $mod = $checksum % 11;
17 $verify_number = $verify_number_list[$mod];
18
19 return $verify_number;
20
21 }
22
23 // 将15位身份证升级到18位
24 function idcard_15to18($idcard){
25 if (strlen($idcard) ! = 15){
26 return false;
27 }else{
28 // 如果身份证顺序码是996 997 998 999,这些是为百岁以上老人的特殊编码
29 if (array_search(substr($idcard, 12, 3), array('996', '997', '998', '999')) ! == false){
30 $idcard = substr($idcard, 0, 6) . '18'. substr($idcard, 6, 9);
31 }else{
32 $idcard = substr($idcard, 0, 6) . '19'. substr($idcard, 6, 9);
33 }
34 }
35
36 $idcard = $idcard . idcard_verify_number($idcard);
37
38 return $idcard;
39 }
40
41 // 18位身份证校验码有效性检查
42 function idcard_checksum18($idcard){
43 if (strlen($idcard) ! = 18){ return false; }
44 $idcard_base = substr($idcard, 0, 17);
45
46 if (idcard_verify_number($idcard_base) ! = strtoupper(substr($idcard, 17, 1))){
47 return false;
48 }else{
49 return true;
50 }
51 }
52
53