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;
}
}