Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检查while()是否是无止境的?_Php_Loops_While Loop - Fatal编程技术网

Php 如何检查while()是否是无止境的?

Php 如何检查while()是否是无止境的?,php,loops,while-loop,Php,Loops,While Loop,让我简单地解释一下这个概念: 从列表中为用户分配一个随机名称。它会检查是否有人已经有了这个名字,如果是真的,它将运行name gen thing,直到找到一个尚未分配的名字。 到目前为止,这一切都很好,我唯一的问题是无法检查列表中的所有用户名是否都已分配。当然,我可以建立一个计数器,检查它是否超过1000次,但这不是一个干净的解决方案,也不是真正的傻瓜。我来告诉你我的意思: $foundCl = false; while($foundCl == false){ // Get Ca

让我简单地解释一下这个概念: 从列表中为用户分配一个随机名称。它会检查是否有人已经有了这个名字,如果是真的,它将运行name gen thing,直到找到一个尚未分配的名字。
到目前为止,这一切都很好,我唯一的问题是无法检查列表中的所有用户名是否都已分配。当然,我可以建立一个计数器,检查它是否超过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在寻找什么。