DEV Community

Lukita Moreno
Lukita Moreno

Posted on

[PHP] Verificar se o CPF é numericamente válido

Opaaa, tudo certo ? como vocês estão ?

Bom ... algumas pessoas podem ter a mesma dúvida que eu tive a um tempo atrás relacionada a como o cálculo para verificar se o CPF é válido é feito.
Eis que encontro um blog onde é explicado passo a passo de como é feita essa validação -> Algoritmo CPF válido

Com a regra de negócio em mãos resolvi transformar a lógica em código.

<?php

$cpf = (string) 74305429055;
$firstVerifiedDigit = $secondVerifiedDigit = 0;

// ## Início cálculo primeiro digito
// pegar os 9 primeiros digitos
$firstNineDigits = substr($cpf, 0, 9);

$countFirst = 0;
$multiplierFirst = 10;
for ($i = 0; $i < 9; $i++) {
    $countFirst += $firstNineDigits[$i] * $multiplierFirst--;
}
echo "\nsoma dos digitos múltiplicados da esquerda para direita com um valor decremental começando por 10: $countFirst\n";

// dividindo a soma (count)  por 11 para obter o resto
$remainder = $countFirst % 11;
echo "\nResto da divisão: $remainder\n";

// Se o resto da divisão for menor que 2, então o dígito é igual a 0 (Zero). -> Como iniciamos o $firstVerifiedDigit com 0 não precisamos da validação
// Se o resto da divisão for maior ou igual a 2, então o dígito verificador é igual a 11 menos o resto da divisão (11 - resto)
if ($remainder >= 2) {
    $firstVerifiedDigit = 11 - $remainder;
}
echo "\nValor do primeiro dígito verificador: $firstVerifiedDigit\n";
// ## Fim cálculo primeiro digito

// ## Início cálculo segundo digito
// adicionando o primeiro digito verificador ao final do cpf
$cpfWithFirstDigit = $firstNineDigits . $firstVerifiedDigit;
echo "\nCPF com o primeiro dígito verificado ao final: $cpfWithFirstDigit\n";

$countSecond = 0;
$multiplierSecond = 11;
for ($i = 0; $i < 10; $i++) {
    $countSecond += $cpfWithFirstDigit[$i] * $multiplierSecond--;
}
echo "\nsoma dos digitos múltiplicados da esquerda para direita com um valor decremental começando por 11: $countSecond\n";

// dividindo a soma (count)  por 11 para obter o resto
$remainder = $countSecond % 11;
echo "\nResto da divisão: $remainder\n";

// Se o resto da divisão for menor que 2, então o dígito é igual a 0 (Zero). -> Como iniciamos o $secondVerifiedDigit com 0 não precisamos da validação
// Se o resto da divisão for maior ou igual a 2, então o dígito verificador é igual a 11 menos o resto da divisão (11 - resto)
if ($remainder >= 2) {
    $secondVerifiedDigit = 11 - $remainder;
}
echo "\nValor do segundo dígito verificador: $secondVerifiedDigit\n";
// ## Fim cálculo segundo digito

// adicionando o segundo digito verificador ao final do cpf
$cpfValid = $cpfWithFirstDigit . $secondVerifiedDigit;
echo "\nCPF: $cpfValid\n";

Enter fullscreen mode Exit fullscreen mode

Tentei deixar bem explicado cada etapa da validação.
Repo: https://github.com/dev-lmoreno/validateCpf

vlwww flwww

referência: https://www.macoratti.net/alg_cpf.htm

Top comments (0)