0

当我最终达到每一种可能性时,如何让循环停止。我怎么知道它什么时候达到了那个水平?有任何想法吗?

背景:所以我有这个脚本,我试图想出一种存储问题的方法,我在目录中的文件周围旋转,并且在给定的目录中有很多文件。当脚本检查文件是否存在时,它会给机器带来过多的负载和渲染时间。所以我总体上试图想出一种存储方法来分解它,其中涉及目录内部的目录,目录内部的目录实际上具有当前 6 个字符大的字符串的所有可能的字母数字组合,但我必须首先处理一些数字,无论如何,我试图想出一种快速理智的方法来为这种情况下的 6 个字母或数字提供给定长度,并让它生成一个包含 az 和 0-9 的每个组合的数组,该长度问题是我可以'

我想出了一种方法来生成我选择的任意长度的随机字符串,但是将它们放入一个数组并不是那么难,但是想出一个停止点的方法让我有。

4

3 回答 3

4

这是一个基于特定字符集计算字符串下一次迭代的函数:

function next_iteration($str, $charset) {
    // last character in charset that requires a carry-over
    $copos = strlen($charset)-1;
    // starting with the least significant digit
    $i = strlen($str)-1;
    do {
        // reset carry-over flag
        $co = false;
        // find position of digit in charset
        $pos = strpos($charset, $str[$i]);
        if ($pos === false) {
            // invalid input char at position $i
            return false;
        }
        // check whether it’s the last character in the charset
        if ($pos === $copos) {
            // we need a carry-over to the next higher digit
            $co = true;
            // check whether we’ve already reached the highest digit
            if ($i === 0) {
                // no next iteration possible due to fixed string length
                return false;
            }
            // set current digit to lowest charset digit
            $str[$i] = $charset[0];
        } else {
            // if no carry-over is required, simply use the next higher digit
            // from the charset
            $str[$i] = $charset[$pos+1];
        }
        // repeat for each digit until there is no carry-over
        $i--;
    } while ($co);
    return $str;
}

$str = 'aaa';
$charset = 'abc';
do {
    var_dump($str);
} while (($str = next_iteration($str, $charset)) !== false);
于 2012-09-29T09:33:31.250 回答
2
$Number= base_convert(mt_rand(1, 9) . intval(microtime(true) * 1000), 10, 36);
echo $Number;
于 2012-09-29T08:42:36.913 回答
1

break您可以使用该语句在某个点退出任何循环。

对于您的可能性,我建议您使用迭代器实现它们并提供一个堆栈,以便您可以测试您是否已经使用了所有可能性:

$stackOfAllPossibilities = $possibilities->getStack();

foreach ($possibilities as $posibility)
{
    ...
    $stackOfAllPossibilities->remove($posibility);
    if ($stackOfAllPossibilities->isEmpty()) {
       break;
    }
}
于 2012-09-29T08:50:25.437 回答