2015-01-21 20 views
1

比方說,我的用戶名數組作爲這樣的:如何在具有遞增編號值的數組中找到可用點?

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

現在,一個新的用戶註冊爲john.doe。我使用LIKE查詢從數據庫中提取了現有的john.doe,並將其存儲在上面的數組中。然後,我想遍歷該數組,以查看哪個點可用於新註冊的john.doe。

在這種情況下,可用的位置是john.doe3。

我知道如何使用while循環完成此操作,只需添加一個增量直到不匹配。

基本上我有兩個問題:

  • 這是完全接近這個用戶名重複的問題的正確方法嗎?

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

+3

爲什麼不直接返回「指定的名稱已被佔用」,讓用戶選擇別的東西嗎? – zerkms 2015-01-21 02:05:50

+0

因爲用戶名將根據用戶的名字和姓氏生成。 – badger 2015-01-21 02:11:53

+1

然後只是循環。從技術上講,你可以使用二分查找來加速查找,但是你不可能有甚至超過10個具有相同名稱的人,所以使用循環是可以的。目前還不清楚爲什麼它缺少'john.doe3' – zerkms 2015-01-21 02:13:38

回答

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

如果用戶名用於訪問用戶個人資料,解決方案1將如何工作? (http://awesomeprofiles.com/john.doe) – badger 2015-01-21 20:01:15

+0

在那些社會基礎網站 - 暴露給公衆的用戶名(暱稱)中,您總是希望它們是唯一的。 – 2015-01-22 15:38:21

+0

我提出的解決方案是爲了最大限度地減少用戶系統中的用戶名衝突。如果您使用的是唯一的用戶名策略,並且您試圖提出備用用戶名建議,則說明您的方法正確。我會使用不唯一的用戶名,並添加必須唯一的暱稱(顯示名稱),或用戶名=電子郵件地址,並添加一個唯一的暱稱。 – 2015-01-22 15:49:10

相關問題