php生成给定长度的每个可能的字母数字组合

时间:2012-09-29 08:39:55

标签: php arrays string

当我最终达到各种可能性时,如何才能停止循环。我怎么知道什么时候达到那个水平?任何想法?

背景:所以我有这个脚本我试图想出一个存储问题的方法我正在围绕目录中的文件和给定目录中的许多文件。当脚本检查文件是否存在时,它会在机器上施加过多的负载并总体呈现时间。所以我总体上试图想出一种存储方法来分解一些涉及目录内目录内的目录,这些目录实际上有一个字符串的所有可能的字母数字组合,当前6个字符大可能更多但我必须首先要处理一些数字,无论如何我想要一个快速理智的方法来提供给定长度的东西,在这种情况下6个字母或数字,并让它生成每个组合的数组az和0-9的长度问题是我想不出要生成那个数组,所以我希望有人可以帮助我。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

$Number= base_convert(mt_rand(1, 9) . intval(microtime(true) * 1000), 10, 36);
echo $Number;

答案 2 :(得分:1)

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

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

$stackOfAllPossibilities = $possibilities->getStack();

foreach ($possibilities as $posibility)
{
    ...
    $stackOfAllPossibilities->remove($posibility);
    if ($stackOfAllPossibilities->isEmpty()) {
       break;
    }
}