Skip to content

Instantly share code, notes, and snippets.

@pusle
Created August 6, 2019 13:37
Show Gist options
  • Save pusle/6dc2e4a7d2b6313d8655fd1371fb551d to your computer and use it in GitHub Desktop.
Save pusle/6dc2e4a7d2b6313d8655fd1371fb551d to your computer and use it in GitHub Desktop.
<?php
/**
* Class PersonalNumber
*
* @TODO calculate age?
*/
class PersonalNumber
{
/**
* @var int
*/
protected $personalNumber = 0;
/**
* @var int
*
* 1 is woman, 2 is man
*/
protected $gender = 0;
/**
* @var int
*/
protected $isValid = 0;
/**
* @var int
*
* mostly used for immigrants as a temporary personal number
* a D-number adds 4 to the first digit
*/
protected $isDNumber = 0;
/**
* @var int
*
* used (mostly) in health care for patient journals
* a H-number adds 4 to the third digit
*/
protected $isHNumber = 0;
/**
* Check the validity of a personal number
*
* This function does not check if the personal number actually exists
*
* @param $personalNumber
* @return mixed
*/
public function checkPersonalNumber($personalNumber) {
$this->personalNumber = $personalNumber;
// return false if $personalNumber is empty
if ( empty($personalNumber)) return false;
// remove values that are not numbers
$personalNumber = preg_replace('/[^0-9]/', '', $personalNumber);
// control check k1
$k1 = (3*$personalNumber[0] + 7*$personalNumber[1] + 6*$personalNumber[2] + 1*$personalNumber[3] + 8*$personalNumber[4] + 9*$personalNumber[5] + 4*$personalNumber[6] + 5*$personalNumber[7] + 2*$personalNumber[8]) % 11;
$k1 = ($k1 == "0") ? 0 : 11-$k1;
// control check k2
$k2 = (5*$personalNumber[0] + 4*$personalNumber[1] + 3*$personalNumber[2] + 2*$personalNumber[3] + 7*$personalNumber[4] + 6*$personalNumber[5] + 5*$personalNumber[6] + 4*$personalNumber[7] + 3*$personalNumber[8] + 2*$k1) % 11;
$k2 = ($k2 == "0") ? 0 : 11-$k2;
// check if it is now just numbers, contains 11 digits and is a valid personal number
if ( (preg_match('#[^0-9]#', $personalNumber)) || (strlen($personalNumber) != 11) || (($k1 != $personalNumber[9]) || ($k2 != $personalNumber[10])) ) return false;
// if we got this far, the personal number is valid
$this->isValid = true;
// set gender value
$this->gender = (($personalNumber[8] % 2) == 0) ? "1" : "2";
// is this a D-number?
$this->isDNumber = ($personalNumber[0] > 3) ? $personalNumber[0] - 4 : $personalNumber[0];
// is this a H-number?
$this->isHNumber = ($personalNumber[2] > 1) ? $personalNumber[2] - 4 : $personalNumber[2];
// we've made it! Now we can return true
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment