KING 博主等级

一帆风顺 ⛵️⛵️⛵️

PHP

根据身份证号获取性别、年龄、生日

钟晓川
2023-06-04 / 105 点赞 / 3351 阅读

PHP根据身份证号,获取性别、年龄、生日、校验身份证号

根据身份证号获取性别
/**
 * Notes: 获取性别
 *
 * @param $idcard
 * @return int|null 奇数是男(1),偶数是女(0)
 */
function getSex($idcard)
{
    if (empty($idcard))
        return null;
    $sex = (int)substr($idcard, 16, 1);
    return $sex % 2 === 0 ? 0 : 1;
}
获取生日
/**
 * Notes: 获取生日
 *
 * @param $idcard
 * @return string|null
 */
function getBirthday($idcard) 
{
    if(empty($idcard))
        return null;
    $bir = substr($idcard, 6, 8);
    $year = (int) substr($bir, 0, 4);
    $month = (int) substr($bir, 4, 2);
    $day = (int) substr($bir, 6, 2);
    return $year . "-" . $month . "-" . $day;
}
计算年龄
/**
 * Notes: 计算年龄
 *
 * @param $idcard
 * @return false|float|int|null
 */
function getAge($idcard)
{
    if(empty($idcard)) 
        return null;
    // 获得出生年月日的时间戳
    $date = strtotime(substr($idcard,6,8));
    // 获得今日的时间戳
    $today = strtotime('today');
    // 得到两个日期相差的大体年数
    $diff = floor(($today-$date)/86400/365);
    // strtotime加上这个年数后得到那日的时间戳后与今日的时间戳相比
    return strtotime(substr($idcard,6,8) . ' + ' . $diff . 'years') > $today ? ($diff + 1) : $diff;
}
校验身份证号
/**
 * Notes: 校验身份证号
 *
 * @param $idcard
 * @return bool
 */
function isIdCard($idcard){
    // 转化为大写,如出现x
    $idcard = strtoupper($idcard);

    // 加权因子
    $wi = array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
    $ai = array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');

    // 按顺序循环处理前17位
    $sigma = 0;

    // 提取前17位的其中一位,并将变量类型转为实数
    for ($i = 0; $i < 17; $i++) {
        $b = (int)$idcard{$i};
        // 提取相应的加权因子
        $w = $wi[$i];
        // 把从身份证号码中提取的一位数字和加权因子相乘,并累加
        $sigma += $b * $w;
    }

    // 计算序号
    $sidcard = $sigma % 11;
    // 按照序号从校验码串中提取相应的字符。
    $check_idcard = $ai[$sidcard];
    if ($idcard{17} == $check_idcard) {
        return true;
    } else {
        return false;
    }
}
105