Vamos fazer uma função em
PHP, que vai retornar se determinado CPF é válido ou não. Mas antes disso, vamos entender como é feito este cálculo.
Como é feito o cálculo do CPF
O CPF é formado por 11 números, e os dois últimos números são os dígitos verificadores. Vamos criar aqui um número qualquer:
555.444.333-89, neste exemplo os dígitos verificadores são 8 e 9.
Vamos testar:
5×10 = 50
5×9 = 45
5×8 = 40
4×7 = 35
4×6 = 24
4×5 = 20
3×4 = 16
3×3 = 9
3×2 = 6
____________
Total = 245
Agora Vamos a alguns cálculos para verificarmos o primeiro dígito.
Dividiremos o total das multiplicações dos números do CPF que foi feita acima (245) por 11, ficando assim:
245 / 11 = 22
Você pode está pensando, porque 22, poderia ser 21 também, vamos explicar:
- Para o cálculo dar certo, precisamos de divisões que sejam exatas ou tenham sobras de números, e não de falta de números.
Exemplo : Usando o processo reverso da divisão (ou seja, a multiplicação) se fosse 21 o resultado da questão, ficaria assim:
245 / 11 = 21
Mas: 21 * 11 = 231
Sendo assim, faltariam números pois o nosso número alvo é 245, e o resultado foi 231 que é menor, e nosso objetivo é que tenha sobra de
números e não a falta de números. Já usando o 22, o resultado ficaria:
245 / 11 = 22
Exemplo : 22 * 11 = 242 (sendo assim, teríamos sobra de números que no caso é 8)
Agora é só usar a sobra ( 8 ) e subtrair por 11, ficando assim:
11 - 8 = 3
Agora que encontramos o Primeiro Dígito (que é 3), já descobrimos que o CPF exemplificado é um CPF inválido, pois o primeiro digito é 3 e
não o número 8.
Função em PHP
function verificar_cpf($val) {
$cpf = str_replace('-', '', str_replace('.', '', $val));
if (!is_numeric($cpf)) {
$status = false;
}
else {
if (($cpf == '11111111111') || ($cpf == '22222222222') || ($cpf == '33333333333') || ($cpf == '44444444444') || ($cpf ==
'55555555555') || ($cpf ==
'66666666666') || ($cpf == '77777777777') || ($cpf == '88888888888') || ($cpf == '99999999999') || ($cpf == '00000000000')) {
$status = false;
}
else {
$dv_informado = substr($cpf, 9, 2);
for ($i = 0; $i <= 8; $i++) {
$digito[$i] = substr($cpf, $i, 1);
}
$posicao = 10;
$soma = 0;
for ($i = 0; $i <= 8; $i++) {
$soma = $soma + $digito[$i] * $posicao;
$posicao = $posicao - 1;
}
$digito[9] = $soma % 11;
if ($digito[9] < 2) {
$digito[9] = 0;
}
else {
$digito[9] = 11 - $digito[9];
}
$posicao = 11;
$soma = 0;
for ($i = 0; $i <= 9; $i++) {
$soma = $soma + $digito[$i] * $posicao;
$posicao = $posicao - 1;
}
$digito[10] = $soma % 11;
if ($digito[10] < 2) {
$digito[10] = 0;
}
else {
$digito[10] = 11 - $digito[10];
}
$dv = $digito[9] * 10 + $digito[10];
if ($dv != $dv_informado) {
$status = false;
}
else $status = true;
}
}
return $status;
}
Depois disso, vamos puxar a informação:
verificar_cpf($cpf)
E para quem quiser ver, aqui tem uma demonstração online:
http://www.renanmpimentel.com.br/exemplos/validar-cpf