打赏

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

posted on 2019-12-26 14:50  头大的冯冯  阅读(1904)  评论(0编辑  收藏  举报

导航