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 に答える