2011-10-24 76 views
0

我有一個數組$used_logins與登錄設置(可能很大),我需要生成一個三個唯一登錄數組,如$login+rand(1, 1000);這將不在$used_logins陣列。在PHP上創建互斥陣列

我該如何快速做到這一點?

回答

1

如果你不能做到這一點在數據庫或這樣的:使用$used_logins鍵來存儲數據。然後檢查是否存在具有該鍵的元素。

$k_used_logins = array_flip($used_logins); // Complexity is O(n) 

$logins = array(); 
do { 
    $l = $login+rand(1, 1000); 
    if (!isset($k_used_logins[$l])) { // Complexity O(1) 
     $logins[] = $l; 
    } 
} while (sizeof($logins) != 3); 

根據數組的列,這可以更快地使用數組搜索每一次的天真方式。 (一個創建數組的副本,但array_search比鍵訪問慢)

+0

'$ used_logins' - 它是關聯數組''key'=>'login'',所以我收到一個錯誤'只能翻轉STRING和INTEGER values'是否有任何方法使它成爲非關聯數組?我希望你的意思是'!isset($ k_used_logins [$ l])' – Yekver

+0

你能提供更多關於數組結構的信息嗎?並感謝isset錯誤的通知:-) – johannes

0

如果這些登錄名在數據庫中,那麼這可能是最有效的方法 - 在'可用登錄名'左側連接'使用登錄名',並且可以在右側用NULL過濾行以獲得'未使用的登錄'

0
  1. 如果登錄總是由您生成的,您可以在其中使用唯一編號(例如時間戳)。編輯:你也可以附加$ used_logins數組的大小($ login + count($ used_logins))。當然,這隻適用於沒有併發請求的情況(您可以添加一個隨機數來避免這種情況)。

  2. 如果其他用戶可能創建登錄,則可以使用in_array()函數檢查登錄是否已經存在。