我有一组带有一组登录的数组$used_logins
(可能很大),我需要生成一个包含$login+rand(1, 1000);
的三个唯一登录的数组,这些登录不在$used_logins
中阵列。
我怎样才能快速完成?
答案 0 :(得分: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);
取决于数组的sie,每次使用数组搜索时,这可能比天真的方式更快。 (一个创建数组的副本,但array_search比密钥访问慢)
答案 1 :(得分:0)
如果这些登录位于数据库中,这可能是最有效的方式 - 在“可用登录”上左键连接到“使用过的登录”,并且可以在右侧对具有NULL的行进行过滤以获得“未使用”登录
答案 2 :(得分:0)
如果您始终生成登录信息,则可以使用其中的唯一编号(例如时间戳)。编辑:您还可以追加$ used_logins数组的大小($ login + count($ used_logins))。当然,这只有在没有并发请求的情况下才有效(您可以添加一个随机数来避免这种情况)。
如果其他用户可以创建登录,您可以使用in_array()函数检查登录是否已存在。