clubs

PHP根据身份证号码,获取性别、获取生日、计算年龄等多个信息

  1 <?php
  2 /**
  3  *  根据身份证号码获取性别
  4  *  author:xiaochuan
  5  * @param string $idcard 身份证号码
  6  * @return int $sex 性别 1男 2女 0未知
  7  */
  8 function get_sex($idcard)
  9 {
 10     if (empty($idcard)) return null;
 11     $sexint = (int)substr($idcard, 16, 1);
 12     return $sexint % 2 === 0 ? \'女\' : \'男\';
 13 }
 14 
 15 /**
 16  *  根据身份证号码获取生日
 17  *  author:xiaochuan
 18  * @param string $idcard 身份证号码
 19  * @return $birthday
 20  */
 21 function get_birthday($idcard)
 22 {
 23     if (empty($idcard)) return null;
 24     $bir = substr($idcard, 6, 8);
 25     $year = (int)substr($bir, 0, 4);
 26     $month = (int)substr($bir, 4, 2);
 27     $day = (int)substr($bir, 6, 2);
 28     return $year . "-" . $month . "-" . $day;
 29 }
 30 
 31 /**
 32  *  根据身份证号码计算年龄
 33  *  author:xiaochuan
 34  * @param string $idcard 身份证号码
 35  * @return int $age
 36  */
 37 function get_age($idcard)
 38 {
 39     if (empty($idcard)) return null;
 40     #  获得出生年月日的时间戳
 41     $date = strtotime(substr($idcard, 6, 8));
 42     #  获得今日的时间戳
 43     $today = strtotime(\'today\');
 44     #  得到两个日期相差的大体年数
 45     $diff = floor(($today - $date) / 86400 / 365);
 46     #  strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
 47     $age = strtotime(substr($idcard, 6, 8) . \' +\' . $diff . \'years\') > $today ? ($diff + 1) : $diff;
 48     return $age;
 49 }
 50 
 51 /**
 52  *  根据身份证号码获取出身地址
 53  *  author:xiaochuan
 54  * @param string $idcard 身份证号码
 55  * @return string $address
 56  */
 57 function get_address($idcard, $type = 1)
 58 {
 59     if (empty($idcard)) return null;
 60     $address = include(\'./address.php\');
 61     switch ($type) {
 62         case 1:
 63             # 截取前六位数(获取基体到县区的地址)
 64             $key = substr($idcard, 0, 6);
 65             if (!empty($address[$key])) return $address[$key];
 66             # 截取前两位数(没有基体到县区的地址就获取省份)
 67             $key = substr($idcard, 0, 2);
 68             if (!empty($address[$key])) return $address[$key];
 69             # 都没有
 70             return \'未知地址\';
 71             break;
 72         case 2:
 73             # 截取前两位数(只获取省份)
 74             $key = substr($idcard, 0, 2);
 75             if (!empty($address[$key])) return $address[$key];
 76             break;
 77         default:
 78             return null;
 79             break;
 80     }
 81 }
 82 
 83 /**
 84  *  判断字符串是否是身份证号
 85  *  author:xiaochuan
 86  * @param string $idcard 身份证号码
 87  */
 88 function isIdCard($idcard)
 89 {
 90     #  转化为大写,如出现x
 91     $idcard = strtoupper($idcard);
 92     #  加权因子
 93     $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
 94     $ai = array(\'1\', \'0\', \'X\', \'9\', \'8\', \'7\', \'6\', \'5\', \'4\', \'3\', \'2\');
 95     #  按顺序循环处理前17位
 96     $sigma = 0;
 97     #  提取前17位的其中一位,并将变量类型转为实数
 98     for ($i = 0; $i < 17; $i++) {
 99         $b = (int)$idcard{$i};
100         #  提取相应的加权因子
101         $w = $wi[$i];
102         #  把从身份证号码中提取的一位数字和加权因子相乘,并累加
103         $sigma += $b * $w;
104     }
105     #  计算序号
106     $sidcard = $sigma % 11;
107     #  按照序号从校验码串中提取相应的字符。
108     $check_idcard = $ai[$sidcard];
109     if ($idcard{17} == $check_idcard) {
110         return \'是正确的身份证\';
111     } else {
112         return \'错误的身份证\';
113     }
114 }
115 
116 /**
117  *  根据身份证号,返回对应的生肖
118  *  author:xiaochuan
119  * @param string $idcard 身份证号码
120  */
121 function get_zodiac($idcard)
122 { //
123     if (empty($idcard)) return null;
124     $start = 1901;
125     $end = (int)substr($idcard, 6, 4);
126     $x = ($start - $end) % 12;
127     $val = \'\';
128     if ($x == 1 || $x == -11) $val = \'鼠\';
129     if ($x == 0) $val = \'牛\';
130     if ($x == 11 || $x == -1) $val = \'虎\';
131     if ($x == 10 || $x == -2) $val = \'兔\';
132     if ($x == 9 || $x == -3) $val = \'龙\';
133     if ($x == 8 || $x == -4) $val = \'蛇\';
134     if ($x == 7 || $x == -5) $val = \'马\';
135     if ($x == 6 || $x == -6) $val = \'羊\';
136     if ($x == 5 || $x == -7) $val = \'猴\';
137     if ($x == 4 || $x == -8) $val = \'鸡\';
138     if ($x == 3 || $x == -9) $val = \'狗\';
139     if ($x == 2 || $x == -10) $val = \'猪\';
140     return $val;
141 }
142 
143 /**
144  *  根据身份证号,返回对应的星座
145  *  author:xiaochuan
146  * @param string $idcard 身份证号码
147  */
148 function get_starsign($idcard)
149 {
150     if (empty($idcard)) return null;
151     $b = substr($idcard, 10, 4);
152     $m = (int)substr($b, 0, 2);
153     $d = (int)substr($b, 2);
154     $val = \'\';
155     if (($m == 1 && $d <= 21) || ($m == 2 && $d <= 19)) {
156         $val = "水瓶座";
157     } else if (($m == 2 && $d > 20) || ($m == 3 && $d <= 20)) {
158         $val = "双鱼座";
159     } else if (($m == 3 && $d > 20) || ($m == 4 && $d <= 20)) {
160         $val = "白羊座";
161     } else if (($m == 4 && $d > 20) || ($m == 5 && $d <= 21)) {
162         $val = "金牛座";
163     } else if (($m == 5 && $d > 21) || ($m == 6 && $d <= 21)) {
164         $val = "双子座";
165     } else if (($m == 6 && $d > 21) || ($m == 7 && $d <= 22)) {
166         $val = "巨蟹座";
167     } else if (($m == 7 && $d > 22) || ($m == 8 && $d <= 23)) {
168         $val = "狮子座";
169     } else if (($m == 8 && $d > 23) || ($m == 9 && $d <= 23)) {
170         $val = "处女座";
171     } else if (($m == 9 && $d > 23) || ($m == 10 && $d <= 23)) {
172         $val = "天秤座";
173     } else if (($m == 10 && $d > 23) || ($m == 11 && $d <= 22)) {
174         $val = "天蝎座";
175     } else if (($m == 11 && $d > 22) || ($m == 12 && $d <= 21)) {
176         $val = "射手座";
177     } else if (($m == 12 && $d > 21) || ($m == 1 && $d <= 20)) {
178         $val = "魔羯座";
179     }
180     return $val;
181 }
182 
183 echo \'<br/>性别:\' . get_sex(\'身份证号码\') . \'<br/>\';
184 echo \'<br/>生日:\' . get_birthday(\'身份证号码\') . \'<br/>\';
185 echo \'<br/>年龄:\' . get_age(\'身份证号码\') . \'<br/>\';
186 echo \'<br/>地址:\' . get_address(\'身份证号码\') . \'<br/>\';
187 echo \'<br/>状态:\' . isIdCard(\'身份证号码\') . \'<br/>\';
188 echo \'<br/>生肖:\' . get_zodiac(\'身份证号码\') . \'<br/>\';
189 echo \'<br/>星座:\' . get_starsign(\'身份证号码\') . \'<br/>\';
190 ?>

 

链接:https://www.php.cn/php-weizijiaocheng-439630.html

分类:

技术点:

相关文章: