2011-04-30 71 views
0

我想知道這個函數是如何工作的,所以我可以在ColdFusion中重新編寫它。我從來沒有用PHP編程。 我認爲,函數檢查$ string是11個數字的長度。你能幫我理解這個簡單的PHP函數嗎?

  1. 但它是如何做到這一點?
  2. 爲什麼它使用循環而不是簡單的len()函數?

我讀了關於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,巴西等同於US SSN#。 CPF的長度爲11個字符。基本上,我需要知道它在做什麼,所以我可以在Coldfusion中編寫函數。

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

這裏是整個代碼段,如果您有興趣:

<? 
    /* 
    *@ Class VALIDATE - It validates Brazilian CPF/CNPJ numbers 
    *@ Developer: André Luis Cupini - [email protected] 
    ************************************************************/ 
    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

稍有偏離主題,但有[CPF]維基百科文章(http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas)驗證僞代碼 - 我會非常*誘惑使用這個而不是上面的PHP代碼。 – 2011-04-30 17:19:50

+0

實現一個計算和檢查控制數字的算法是不是更好?人們可能會嘗試像12345678901這樣的事情,根據您的算法,這將完全正確。查看維基百科的例子:http://en.wikipedia.org/wiki/Cadastro_de_Pessoas_F%C3%ADsicas – 2011-04-30 17:22:03

+0

@middaparka和@Emil Vikstrom,不是我的代碼片段中的主要功能嗎? – Mohamad 2011-04-30 17:39:17

回答

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

In簡而言之,它會測試以查看提供的字符串是否只是重複的$ length時間的相同數字。

2

它基本上可以確保數量不是:

11111111111 
22222222222 
33333333333 
44444444444 
55555555555 

等等

相關問題