Php 执行While循环-最佳方法

Php 执行While循环-最佳方法,php,loops,mkdir,do-while,Php,Loops,Mkdir,Do While,我有正确的PHP脚本来创建一个随机数,并在服务器上创建一个新文件夹,名称为#。如果文件夹存在,脚本将停止。但我不明白的是,如果文件夹已经存在,如何引导脚本生成一个新的随机数,然后重试,直到找到一个未使用的数字/文件夹。我想我正在寻找一个do-while,但不确定我是否正确编写了它(不想在服务器上测试它,因为害怕创建一个永久循环mkdir命令) 这是正在使用的一次性代码 <?php $clientid = rand(1,5); while (!file_exists("clients/$cl

我有正确的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");
?>

问题是,在循环之外,只生成一个新数字。这意味着您将得到一个永不终止的循环。反转循环并在每次迭代中生成一个新编号:

$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)");

我会这样做:

<?php
$filename = md5(time().rand()) . ".txt";
while(is_file("clients/$filename")){
    $filename = md5(time().rand()) . ".txt";
}
touch("clients/$filename");
$safetyCount = 0;
while (yourLogic && $safeCount < 500){

//more of your logic
$safetyCount++;
}

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

<?php
$filename = md5(time().rand()) . ".txt";
while(is_file("clients/$filename")){
    $filename = md5(time().rand()) . ".txt";
}
touch("clients/$filename");
$safetyCount = 0;
while (yourLogic && $safeCount < 500){

//more of your logic
$safetyCount++;
}
$safetyCount=0;
while(yourLogic&&$safeCount<500){
//更多你的逻辑
$safetyCount++;
}

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

alex真是太棒了,我很感激——顺便说一句,我的随机数将设置为10k到90k,所以在没有可用的数字之前还有很长的路要走——但为了涵盖所有的基础,使用类似于MadDokMike关于安全计数的建议的逻辑会不会是通过退出()错误退出脚本的方法如果使用了所有数字?@user2065226是的。如果使用了所有可能的组合,您将需要其他东西来打破循环。计数器是一种方法。设置10000个循环的硬限制可能是一个好主意,以防万一。像这样的代码在将来可能会被人遗忘和绊倒。谢谢你-没有足够的声誉来投票-对不起,但是谢谢你的想法,我会在将来使用它