首页 > 解决方案 > 如何使用沙特 ID 格式生成和验证随机 ID?

问题描述

我需要生成随机 ID,以根据此问题中显示的沙特 ID 标准进行验证:

沙特伊卡马/国民身份证号码字段验证

我试过以下代码:

$random_numbers = [];
while(count($random_numbers) < 1000000000){
    do  {
    $random_number = mt_rand(1000000000,9000000000);  
     
}

while (in_array($random_number, $random_numbers));{
$type = substr ( $random_number, 0, 1 );
if($type != 2 && $type != 1 ) break;

$sum = 0;
for( $i = 0 ; $i<10 ; $i++ ) {
  if ( $i % 2 == 0){
    $ZFOdd = str_pad ( ( substr($random_number, $i, 1) * 2 ), 2, "0", STR_PAD_LEFT );
    $sum += substr ( $ZFOdd, 0, 1 ) + substr ( $ZFOdd, 1, 1 );
  }else{
    $sum += substr ( $random_number, $i, 1 );
  }
}
return $sum%10 ? break : echo  $random_number;


 ----------



echo "<br>";
$random_numbers[] = $random_number;}
}

标签: php

解决方案


免责声明: 我不能 100% 确定沙特身份证号码所需的验证等,并且只简要查看了链接问题中提供的答案


好的,所以,我的理解是您需要生成一个随机 id

  1. 匹配模式/格式:

    [12]\d{9}
    
  2. 根据链接问题中显示的标准进行验证:

为此,我们需要创建几个函数;一种用于生成 ID,另一种用于根据给定标准验证 ID。

生成标识

简单地生成一个 ID 就足够简单了。我们可以random_int在 PHP 中使用带有循环的函数。如果我们将生成 ID 的代码包含在do...while...循环中,那么我们可以执行代码并重复验证 ID,直到我们得到一个有效的 ID。

function getRandomSaudiId() : int
{
    do {
        $saudiId = (string) random_int(1,2);
        for($i = 0; $i < 9; $i++){
            $saudiId .= random_int(0,9);
        }
    } while(validateSaudiId($saudiId) === false);

    return (int) $saudiId;
}

验证身份证

注意:我们转换为,string以便我们可以根据索引访问数字。

function validateSaudiId(string $id) : bool
{
    $sum = 0;
    for($i = 0; $i < 9; $i++){
        if( $i % 2 ){
            // Even number
            $sum += $id[$i];
        }
        else{
            //Odd number
            $increment = $id[$i] * 2;
            while($increment > 9){
                $increment = (string) $increment;
                $increment = $increment[0] + $increment[1];
            }
            $sum += $increment;
        }
    }

    $sum = (string) $sum;

    return ($sum[1] == $id[9] || $id[9] == (10 - $sum[1])) ? true : false;
}

示例使用

for($i = 0; $i < 10; $i++) var_dump(getRandomSaudiId());

/*

Output:

int(2933617506)
int(2409806096)
int(1072585118)
int(2891306413)
int(1810304558)
int(2591965856)
int(1363032527)
int(1031823269)
int(1265954048)
int(2498099472)
int(1134172537)

*/

推荐阅读