zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    字符串的操作
    10.20 整理1
    if else; while; break;continue ----流程控制系列
    10.19 重新打了第一天的代码(课件))
    10.17
    svn,导入数据到版本库及使用工作副本
    mysql的反引号backtick
    css中的1px并不等于设备的1px
    onclick事件属性与在用js绑定onclick事件中的this的区别
    一次对CI框架update方法底层实现的探索之旅
  • 原文地址:https://www.cnblogs.com/clubs/p/12102019.html
Copyright © 2011-2022 走看看