PHP使用规范生成唯一的代码

PHP使用规范生成唯一的代码,php,random,Php,Random,我试图编写一个PHP函数来生成一个3个字母的代码。第一个字母必须是X、Y或Z,并且必须遵循以下格式:XAA、XAB、XAC。。。。直到XAW,然后是XBA,XBB,XBC。。。。直到XBW,然后是XCA,XCB。。。。。等等 当“X”完成后,然后是,是,等等。。。 当“Y”完成时,ZAA,ZAB,等等 此代码的第2个和第3个字母不能是X、Y或Z 我正在从数据库中获取最后生成的代码 这是我到目前为止得到的。。对最终条件感到困惑: $valid = str_split("ABCDEFGHIJKLMN

我试图编写一个PHP函数来生成一个3个字母的代码。第一个字母必须是X、Y或Z,并且必须遵循以下格式:XAA、XAB、XAC。。。。直到XAW,然后是XBA,XBB,XBC。。。。直到XBW,然后是XCA,XCB。。。。。等等

当“X”完成后,然后是,是,等等。。。 当“Y”完成时,ZAA,ZAB,等等

此代码的第2个和第3个字母不能是X、Y或Z

我正在从数据库中获取最后生成的代码

这是我到目前为止得到的。。对最终条件感到困惑:

$valid = str_split("ABCDEFGHIJKLMNOPQRSTUVW");

if($result->num_rows() < 1)
    $last_code = 'XAA';
else {
    $result = $result->row_array();
    $last_code = $result['employee_code'];
}

$arr = str_split($last_code);

$first  = $arr[0];
$second = $arr[1];
$third  = $arr[2];

if($first == 'X') {

} else if($second == 'Y') {

} else if($third == 'Z') {

}
$valid=str_split(“abcdefghijklmnopqrstuv”);
如果($result->num_rows()<1)
$last_code='XAA';
否则{
$result=$result->row_array();
$last_code=$result['employee_code'];
}
$arr=str\U分割($last\U代码);
$first=$arr[0];
$second=$arr[1];
$third=$arr[2];
如果($first=='X'){
}else if($second=='Y'){
}else if($third=='Z'){
}

逻辑非常简单,因为PHP具有以下机制:

$letter = 'a';
echo ++$letter; // echoes 'b'
这是好的

现在,您只需确保自己是代码的边界:

  • 如果第二个和/或第三个字母是
    'W'
    ,它将被替换为
    'A'
    ,而前一个字母将递增
  • 如果第一个字母是
    'Z'
    ,且应递增,则算法无法生成新代码
  • 在所有其他情况下,只需增加最后一个字母即可

    if($result->num_rows() < 1) {
        //If no code exists the new code is XAA, not the old one.
        return 'XAA';
    }
    
    $result = $result->row_array();
    $last_code = $result['employee_code'];
    $new_code = $old_code;
    
    if ($old_code[2] === 'W') {
        if ($old_code[1] === 'W') {
            if ($old_code[0] === 'Z') {
                throw new Exception('All codes used! Add new algorithm');
            } 
            $new_code[0] = ++$old_code[0];
            $new_code[1] = 'A';
        } else {
            $new_code[1] = ++$old_code[1];
        }
        $new_code[2] = 'A';
    } else {
        $new_code[2] = ++$old_code[2];
    }
    return $new_code;
    
    if($result->num_rows()<1){
    //如果不存在代码,则新代码是XAA,而不是旧代码。
    返回“XAA”;
    }
    $result=$result->row_array();
    $last_code=$result['employee_code'];
    $new_code=$old_code;
    如果($old_code[2]='W'){
    如果($old_code[1]='W'){
    如果($old_code[0]='Z'){
    抛出新异常(‘使用了所有代码!添加新算法’);
    } 
    $new_code[0]=++$old_code[0];
    $new_code[1]=“A”;
    }否则{
    $new_code[1]=++$old_code[1];
    }
    $new_code[2]=“A”;
    }否则{
    $new_code[2]=++$old_code[2];
    }
    返回$new_代码;
    

    前两个
    if
    条件处理边界1,而第三个
    if
    条件处理边界2。
    else
    块处理字母的增量。

    我编写了一个更简单的逻辑:

    public function generate_code() {
        $result = $this->db->query("SELECT employee_code FROM employees ORDER BY id DESC LIMIT 1");
    
        $invalid = str_split("XYZ");
    
        if($result->num_rows() < 1)
            $last_code = 'XAA';
        else {
            $result = $result->row_array();
            $last_code = $result['employee_code'];
        }
    
        $last_code++;
    
        while(in_array($last_code[1], $invalid)) {
            $last_code++;
        }
    
        while(in_array($last_code[2], $invalid)) {
            $last_code++;
        }
    
        return $last_code;
    }
    
    公共函数生成_代码(){
    $result=$this->db->query(“根据id DESC LIMIT 1从员工订单中选择员工_代码”);
    $invalid=str_分割(“XYZ”);
    如果($result->num_rows()<1)
    $last_code='XAA';
    否则{
    $result=$result->row_array();
    $last_code=$result['employee_code'];
    }
    $last_code++;
    while(在数组中($last_code[1],$invalid)){
    $last_code++;
    }
    while(在数组中($last_code[2],$invalid)){
    $last_code++;
    }
    返回$last_代码;
    }
    
    谢谢,我在下面发布了一个简单的逻辑代码。这就是你问题的解决方案吗?@Adam是的,它解决了问题。这不是很有效,但很有效。