我有一個數組$used_logins
與登錄設置(可能很大),我需要生成一個三個唯一登錄數組,如$login+rand(1, 1000);
這將不在$used_logins
陣列。在PHP上創建互斥陣列
我該如何快速做到這一點?
我有一個數組$used_logins
與登錄設置(可能很大),我需要生成一個三個唯一登錄數組,如$login+rand(1, 1000);
這將不在$used_logins
陣列。在PHP上創建互斥陣列
我該如何快速做到這一點?
如果你不能做到這一點在數據庫或這樣的:使用$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比鍵訪問慢)
如果這些登錄名在數據庫中,那麼這可能是最有效的方法 - 在'可用登錄名'左側連接'使用登錄名',並且可以在右側用NULL過濾行以獲得'未使用的登錄'
如果登錄總是由您生成的,您可以在其中使用唯一編號(例如時間戳)。編輯:你也可以附加$ used_logins數組的大小($ login + count($ used_logins))。當然,這隻適用於沒有併發請求的情況(您可以添加一個隨機數來避免這種情況)。
如果其他用戶可能創建登錄,則可以使用in_array()函數檢查登錄是否已經存在。
'$ used_logins' - 它是關聯數組''key'=>'login'',所以我收到一個錯誤'只能翻轉STRING和INTEGER values'是否有任何方法使它成爲非關聯數組?我希望你的意思是'!isset($ k_used_logins [$ l])' – Yekver
你能提供更多關於數組結構的信息嗎?並感謝isset錯誤的通知:-) – johannes