你能帮我理解这个简单的PHP函数吗?

时间:2011-04-30 17:10:47

标签: php

我想知道这个函数是如何工作的,所以我可以在ColdFusion中重写它。我从来没有用PHP编程。 我认为,该函数会检查$ string的长度是否为11个数字。

  1. 但它是如何做到的?
  2. 为什么使用循环而不是简单的len()函数?
  3. 我读了str_pad(),并了解它。但循环迭代$i作为第三个参数的功能是什么?它在做什么?

    if($this->check_fake($cpf, 11)) return FALSE;
    
    function check_fake($string, $length)
    {
       for($i = 0; $i <= 9; $i++) {
       $fake = str_pad("", $length, $i);
       if($string === $fake) return(1);
       }
    }
    

    该功能旨在验证CPF,巴西相当于美国SSN#。 CPF的长度为11个字符。基本上,我需要知道它在做什么,所以我可以在Coldfusion中编写函数。

    如果它只是一个长度,不能是if (len(cpf) != 11) return false;

    以下是您感兴趣的整个代码段:

        <?
        /*
        *@ Class VALIDATE - It validates Brazilian CPF/CNPJ numbers 
        *@ Developer: André Luis Cupini - andre@neobiz.com.br
        ************************************************************/
        class VALIDATE
        {
            /*
            *@ Remove ".", "-", "/" of the string
            *****************************************************/
            function cleaner($string)
            {
                return $string = str_replace("/", "", str_replace("-", "", str_replace(".", "", $string)));
            }
    
            /*
            *@ Check if the number is fake
            *****************************************************/
            function check_fake($string, $length)
            {
                for($i = 0; $i <= 9; $i++) {
                    $fake = str_pad("", $length, $i);
                    if($string === $fake) return(1);
                }
            }
    
            /*
            *@ Validates CPF
            *****************************************************/
            function cpf($cpf) 
            {
                $cpf = $this->cleaner($cpf);
                $cpf = trim($cpf);
                if(empty($cpf) || strlen($cpf) != 11) return FALSE;
                else {
                    if($this->check_fake($cpf, 11)) return FALSE;
                    else {
                        $sub_cpf = substr($cpf, 0, 9);
                        for($i =0; $i <=9; $i++) {
                            $dv += ($sub_cpf[$i] * (10-$i));
                        }
                        if ($dv == 0) return FALSE; 
                        $dv = 11 - ($dv % 11); 
                        if($dv > 9) $dv = 0;
                        if($cpf[9] != $dv) return FALSE;
    
                        $dv *= 2;
                        for($i = 0; $i <=9; $i++) {
                            $dv += ($sub_cpf[$i] * (11-$i));
                        }
                        $dv = 11 - ($dv % 11); 
                        if($dv > 9) $dv = 0;
                        if($cpf[10] != $dv) return FALSE;
                        return TRUE;
                    }
                }
            }
    }
    ?>
    

2 个答案:

答案 0 :(得分:2)

它基本上确保数字不是:

11111111111
22222222222
33333333333
44444444444
55555555555

等...

答案 1 :(得分:1)

评论:

function check_fake($string, $length)
{
    // for all digits
    for($i = 0; $i <= 9; $i++) 
    {
        // create a $length characters long string, consisting of
        // $length number of the number $i
        // e.g. 00000000000
        $fake = str_pad("", $length, $i);
        // return true if the provided CPN is equal
        if($string === $fake) return(1);
    }
}

简而言之,它会测试所提供的字符串是否只是重复$ length次的相同数字。