Php 如何检查while()是否是无止境的?
让我简单地解释一下这个概念: 从列表中为用户分配一个随机名称。它会检查是否有人已经有了这个名字,如果是真的,它将运行name gen thing,直到找到一个尚未分配的名字。Php 如何检查while()是否是无止境的?,php,loops,while-loop,Php,Loops,While Loop,让我简单地解释一下这个概念: 从列表中为用户分配一个随机名称。它会检查是否有人已经有了这个名字,如果是真的,它将运行name gen thing,直到找到一个尚未分配的名字。 到目前为止,这一切都很好,我唯一的问题是无法检查列表中的所有用户名是否都已分配。当然,我可以建立一个计数器,检查它是否超过1000次,但这不是一个干净的解决方案,也不是真正的傻瓜。我来告诉你我的意思: $foundCl = false; while($foundCl == false){ // Get Ca
到目前为止,这一切都很好,我唯一的问题是无法检查列表中的所有用户名是否都已分配。当然,我可以建立一个计数器,检查它是否超过1000次,但这不是一个干净的解决方案,也不是真正的傻瓜。我来告诉你我的意思:
$foundCl = false;
while($foundCl == false){ // Get Callname n stuff
$Cl = getCallname(); // <- selects a random name from a list
$lFoundCl = true;
$sql = mysql_query("SELECT * FROM Board_Callnames WHERE TID='$TID'");
while ($row = mysql_fetch_array($sql)){ // Checks if the name is already assigned
if($row['Callname'] == $Cl['callname']){
$lFoundCl = false;
}
}
if($lFoundCl == true){ // Found a name that isnt assigned yet, assign it to the user, dont worry about all the values here and the Cl[color] stuff
$foundCl = true;
$Cln = $Cl['callname'];
$Clc = $Cl['color'];
$ClEntry = mysql_query("INSERT INTO Board_Callnames (TID, UID, Callname, Color, Flair) VALUES ('$TID', '$UID', '$Cln', '$Clc', '0')");
} else {
$foundCl = false;
}
/* What I need:
if(this == endless){ break; }
*/
}
整个逻辑似乎是错误的 与其从所有项目的列表中生成随机项目,然后检查其是否已分配,不如从未分配项目的列表中生成随机项目,例如:
SELECT * FROM `itemlist` WHERE `assigned` = 0 LIMIT 1
整个逻辑似乎是错误的 与其从所有项目的列表中生成随机项目,然后检查其是否已分配,不如从未分配项目的列表中生成随机项目,例如:
SELECT * FROM `itemlist` WHERE `assigned` = 0 LIMIT 1
一种方法是通过检查每个糖果,然后从那些还没有取的糖果中随机选择一个名字,来建立一个可用名字的列表。如果可用列表为空,则表示已用完。一种方法是通过检查每个糖果,然后从尚未取出的糖果中随机选择一个名称,来建立可用名称的列表。如果可用列表为空,则表示已用完。您可以检查数据库中是否已经有
计数($callnames)
用户,因为这是可能的最大名称数。您可以检查是否已经有计数($callnames)
数据库中的用户,因为这是可能的最大名称数。您可能不想将可能的“调用名”和“颜色”存储在PHP数组中,而是想将它们移动到数据库中,并为它们分配ID
然后,您可以创建一个查询,该查询返回一个随机的未分配名称ID(如果可用)或一个空结果集(如果没有名称可用)。。。例如:
从callnames cn中选择cn.id
左连接板\u Callnames bcn ON bcn.callname=cn.callname
其中bcn.callname为NULL
按兰德排序()限制1
显然,如果您使用ID作为名称,您可能希望更改Board_Callnames表,使其不存储字符串,而是存储名称ID。。。(并相应地更改我的查询)但这取决于您试图做什么
我刚刚意识到,如果没有ID,这也可以工作。您需要一个表,其中一列包含可用的调用名。然后,您可以使用此查询获取随机可用的调用名:
从callnames cn中选择cn.callname
左连接板\u Callnames bcn ON bcn.callname=cn.callname
其中bcn.callname为NULL
按兰德排序()限制1
与在PHP数组中存储可能的“调用名”和“颜色”不同,您可能还希望将它们移动到数据库中,并为它们分配ID
然后,您可以创建一个查询,该查询返回一个随机的未分配名称ID(如果可用)或一个空结果集(如果没有名称可用)。。。例如:
从callnames cn中选择cn.id
左连接板\u Callnames bcn ON bcn.callname=cn.callname
其中bcn.callname为NULL
按兰德排序()限制1
显然,如果您使用ID作为名称,您可能希望更改Board_Callnames表,使其不存储字符串,而是存储名称ID。。。(并相应地更改我的查询)但这取决于您试图做什么
我刚刚意识到,如果没有ID,这也可以工作。您需要一个表,其中一列包含可用的调用名。然后,您可以使用此查询获取随机可用的调用名:
从callnames cn中选择cn.callname
左连接板\u Callnames bcn ON bcn.callname=cn.callname
其中bcn.callname为NULL
按兰德排序()限制1
这是一个停顿问题,本身无法解决。请将getCallname
主体添加到您的问题中。您可以做的是添加有限的尝试次数,例如10次或100次。这虽然不会结束…但不是随机检查姓名,而是获取完整列表,完全随机,然后循环它们。这是停顿问题,本身无法解决。请将getCallname
主体添加到您的问题中。您可以做的是添加有限的尝试次数,例如10次或100次。这无论如何不会结束…与其随机检查姓名,不如获得完整的列表,完全随机,如果我只做一次,这是有意义的,但我需要100次,所以这个选项不是available@user3112337我真的不明白为什么你需要做这件事的次数会影响任何事情。请解释我每次需要时都需要做新的列表条目,如果我只做一次就有意义了,但我需要100次,所以这个选项不存在available@user3112337我真的不明白为什么你需要做这件事的次数会影响任何事情。请解释一下,我需要在每次需要的时候创建新的列表条目,但这样做并不能确保每个名字都会得到处理。它可能会在同一个名称上重复多次。StepeP的解决方案似乎更好。顺便说一句,这取决于OP在寻找什么。但这样做并不能确保每个名字都会被对待。它可能会在同一个名称上重复多次。StepeP的解决方案似乎更好。顺便说一下,这取决于OP在寻找什么。