<?php /* * 身份证号码的结构 * 六位数字地址码,八位数字出生日期码,三位数字顺序码和一位校验码。 * 地址码按GB/T2260的规定执行。 * 出生日期码按GB/T7408的规定执行,年、月、日代码之间不用分隔符。 * 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号。 ** 顺序码的奇数分配给男性,偶数分配给女性。 * 校验码计算步骤 ** 前17位加权求和,再用和除以11后所得的余数,该余数即为校验码 */ $addr = "640522"; // 前六位数字 $seq = "008"; // 倒数第一位前面的三位数 $val = "5"; // 最后一位数 $year = "2013"; // 出生的年 $ids = ""; for($m = 1;$m < 13;$m++){ $month = str_pad($m, 2, "0", STR_PAD_LEFT); $month_max_day = cal_days_in_month(CAL_GREGORIAN, $month, $year); for($d = 1;$d < $month_max_day+1;$d++){ $monthday = str_pad($d, 2, "0", STR_PAD_LEFT); $date = $year . $month . $monthday; $id = $addr . $date . $seq . $val; // echo $id ."<br>\r\n"; if(checkId($id)){ echo $id ."<br>\r\n"; $id_format = $addr .' '. $date .' '. $seq . $val; $ids .= $id_format ."\r\n"; } } } $ids_array = explode("\r\n", $ids); $line = count($ids_array) -1; echo $line; file_put_contents($year .'id.txt', $ids); function checkId($id){ $len = strlen($id); if($len != 18){ return 0; } # 前17位的每一位乘以固定值后再求和 $a = str_split($id, 1); // 前17位切分成数组 $w = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2); // 前17位对应的加权因子 $c = array(1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2); // 对应的10个校验码,10用X代替 $sum = 0; for($i = 0;$i < 17;$i++){ $sum = $sum + $a[$i] * $w[$i]; } # 计算模(当两数为正整数时,模数等于余数) $r = $sum % 11; $res = $c[$r]; // echo "校验位是 => " . $res; if($res == $a[17]){ return $id; }else{ return false; } } $city = array( 11 => "北京", 12 => "天津", 13 => "河北", 14 => "山西", 15 => "内蒙古", 21 => "辽宁", 22 => "吉林", 23 => "黑龙江",31 => "上海", 32 => "江苏", 33 => "浙江", 34 => "安徽", 35 => "福建", 36 => "江西", 37 => "山东", 41 => "河南", 42 => "湖北", 43 => "湖南", 44 => "广东", 45 => "广西", 46 => "海南", 50 => "重庆", 51 => "四川", 52 => "贵州", 53 => "云南", 54 => "西藏", 61 => "陕西", 62 => "甘肃", 63 => "青海", 64 => "宁夏", 65 => "新疆", 71 => "台湾", 81 => "香港", 82 => "澳门", 91 => "国外" ); ?>