【问题标题】:Do While LOOP - best approachDo While LOOP - 最佳方法
【发布时间】:2013-04-29 16:21:12
【问题描述】:

我有正确的 PHP 脚本来创建一个随机数并在服务器上创建一个新文件夹,并将 # 作为它的名称。如果文件夹存在,则脚本停止。我不知道的是如何指示脚本生成一个新的随机 # 如果文件夹已经存在并重试,直到它找到一个未使用的号码/文件夹。我认为 do while 是我正在寻找的,但不确定我是否正确编写了它(不想在服务器上测试它,因为害怕创建一个永远循环的 mkdir 命令)。

这是使用的一次性代码

<?php
$clientid = rand(1,5);
while (!file_exists("clients/$clientid"))
{
mkdir("clients/$clientid", 0755, true);
exit("Your new business ID is($clientid)");
}
echo ("The client id is $clientid");
?>

这是我正在考虑的do while - 这是正确的还是我需要以不同的方式这样做?

<?php

$clientid = rand(1,5);

do {mkdir("clients/$clientid", 0755, true);
    exit("Your new business ID is($clientid)");}

while (!file_exists("clients/$clientid"));
echo ("The client id is $clientid");

?>

【问题讨论】:

    标签: php loops mkdir do-while


    【解决方案1】:

    问题是您只能在循环外生成一次新数字。这意味着您最终会得到一个永不终止的循环。反转循环并在每次迭代时生成一个新数字:

    $clientid = rand(1,5);
    while (file_exists("clients/$clientid"))
    {
        // While we are in here, the file exists. Generate a new number and try again.
        $clientid = rand(1,5);
    }
    
    // We are now guaranteed that we have a unique filename.
    mkdir("clients/$clientid", 0755, true);
    exit("Your new business ID is($clientid)");
    

    【讨论】:

    • alex 工作的真棒,我很欣赏它 - 附带说明,我的随机数将设置为 10k 到 90k,因此在没有可用数字之前它有很长的路要走 - 但只是为了覆盖所有基础,如果使用了所有数字,是否会在安全计数上使用类似于 MadDokMike 建议的逻辑以退出脚本并使用 exit() 出错?
    • @user2065226 是的。如果使用了所有可能的组合,您将需要其他东西来打破循环。计数器是一种方式。
    • 设置 10000 个循环的硬性限制可能是一个好主意,以防万一。像这样的代码有可能会被遗忘并在未来绊倒某人。
    【解决方案2】:

    我会这样做:

    <?php
    $filename = md5(time().rand()) . ".txt";
    while(is_file("clients/$filename")){
        $filename = md5(time().rand()) . ".txt";
    }
    touch("clients/$filename");
    

    【讨论】:

      【解决方案3】:

      在 while 循环中测试代码时的有用提示;创建变量作为安全计数并增加它,然后如果您的其他逻辑导致它爆发的无限问题,如下所示:

      $safetyCount = 0;
      while (yourLogic && $safeCount < 500){
      
      //more of your logic
      $safetyCount++;
      }
      

      显然,如果您需要 500 更低/更高,然后将其设置为任何值,这只是确保您不会杀死您的机器。 :)

      【讨论】:

      • 谢谢 - 没有足够的声誉来投票 - 抱歉,但谢谢你的想法,我会在未来使用它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-16
      • 2013-12-26
      • 2014-01-11
      • 1970-01-01
      • 2015-12-20
      • 1970-01-01
      相关资源
      最近更新 更多