با سلام مجدد من جستجو کردم و در چند سایت این الگوریتم رو دیدم به ویژه انجمن پی اچ پی گروپ که عینا درج میکنم .
روش اعتبار سنجی کد ملی :

دهمین رقم شماره ملی را ( از سمت چپ ) به عنوان A در نظر می گیریم.
یک مقدار B در نظر می گیریم و آن را برابر با :

(اولین رقم * ۱۰) + ( دومین رقم * ۹ ) + ( سومین رقم * ۸ ) + ( چهارمین رقم * ۷ ) + ( پنجمین رقم * ۶) + ( ششمین رقم * ۵ ) + ( هفتمین رقم * ۴ ) + ( هشتمین رقم * ۳ ) + ( نهمین رقم * ۲ )


قرار می دهیم.

مقدار Cرا برابر با B – (B/11)*11 قرار می دهیم.



اگر مقدار Cبرابر با صفر باشد و مقدار Aبرابر Cباشد کد ملی صحیح است.

اگر مقدار Cبرابر با ۱ باشد و مقدار Aبرابر با ۱ باشد کد ملی صحیح است.

اگر مقدار Cبزرگتر از ۱ باشد و مقدار A برابر با ۱۱ – Cباشد کد ملی صحیح است.
همینطور یک کلاس که جناب آقای رضا شعاری نوشته بودند اینجا قرار میدم امیدوارم مفید باشه.
کد PHP:
<?php
/** * In the name of God * * Validate National Iranian Code * * @package melliCode * @version 1.0.0 mellicode.class.php Wednesday, January 12, 2011 * @author Reza Sheari * @web http://www.Vvolf.net * @email r.sheari@gmail.com */
class melliCode{    /**     * Hold National Code     *     * @access Protected     * @var Integer     */    protected static $nationalCode int;
    
/**     * Incorrect List     *     * @access Protected     * @var Integer     */    protected static $notNationalCode = array(                                            "1111111111",                                             "2222222222",                                             "3333333333",                                             "4444444444",                                             "5555555555",                                             "6666666666",                                             "7777777777",                                             "8888888888",                                             "9999999999",                                             "0000000000");
    
/**     * Construct     *     * @access Public     * @var Empty     */    public function __construct()    {            }
    
/**     * National Validation Code     *     * @access Public     * @var Integer     */    public function nationalCode($code)    {        self::$nationalCode trim($code);
        if(
self::validCode())        {            $melliCode self::$nationalCode;
            
$subMid self::subMidNumbers($melliCode101);
            
$getNum 0;
            for(
$i 1$i 10$i++)                $getNum += (self::subMidNumbers($melliCode$i1) * (11 $i));
            
$modulus = ($getNum 11);
            if(((
$modulus 2) && ($subMid == $modulus)) || (($modulus >= 2) && ($subMid == (11 $modulus))))                return true;        }
        return 
false;    }
    
/**     * Validate     *     * @access Protected     * @var Boolean     */    protected function validCode()    {        $melliCode self::$nationalCode;
        if((
is_numeric($melliCode)) && (strlen($melliCode) == 10) && (strspn($melliCode$melliCode[0]) != strlen($melliCode)))            return true;
        return 
false;    }
    
/**     * Get Portion of String Specified     *     * @access Protected     * @var Integer     */    protected function subMidNumbers($number$start$length)    {        $number substr($number, ($start 1), $length);
        return 
$number;    }}
?>