如何在具有递增编号值的数组中查找可用位置


How to find an available spot in an array that has incrementing numbered values?

假设我有一个用户名数组:

[
'john.doe',
'john.doe1',
'john.doe2',
'john.doe4',
'john.doe5'
]

现在,一个新用户注册为 john.doe。我已经使用 LIKE 查询从数据库中获取了已经存在的 john.doe,并存储在上面的数组中。然后我想遍历该数组,看看哪个位置可用于新注册的 john.doe。

在这种情况下,可用位置将是john.doe3。

我知道如何使用 while 循环并简单地添加一个增量直到没有匹配项来做到这一点。

基本上我有两个问题:

  • 这是完全解决此重复用户名问题的正确方法吗?

  • 我想知道是否有更好的方法来代替使用 while 循环?

  1. 不 - 最好使用标识令牌,请考虑添加第三个值,例如:md5('username'.'date')md5('username'.'fullname'),然后您可以为特定用户使用此标识符。

    更好的做法是仅将用户行 ID 用于关系和任何查询,并且您使用用户名(+密码)的唯一步骤是在登录时。

  2. 给你:

    //without while:
    /* NOT TESTED */
    /* $uname -> is the username requested without the duplicate number */
    function find_aspot($arr, $uname) {
        natsort($arr);
        if (empty($arr) || $arr[0] !== $uname) return $uname;
        foreach($arr as $key => $data) {
           $cur = str_replace($uname,'',$data);
           $cur = ($cur === '')?0:intval($cur);
           if (!isset($arr[$key+1])) break;
           $next = intval(str_replace($uname,'',$arr[$key+1]))
           if ($cur+1 !== $next) break;
        }
        return $uname.($cur+1);
    }