2012-09-29 69 views
0

當我終於達到所有可能性時,我怎樣才能得到一個循環來停止。我怎麼知道什麼時候達到了這個水平?有任何想法嗎?php生成給定長度的每個可能的字母數字組合

背景:所以我有這個腳本我想拿出一個存儲問題的手段我正在圍繞目錄中的文件進行循環,並且存在給定目錄中的許多文件。當腳本檢查文件是否存在時,它會在機器上施加過多的負載並渲染整個時間。所以我總體上試圖想出一種存儲方法來打破它的一些涉及目錄裏面的目錄裏面的目錄,字面上有字符串的所有可能的字母數字組合,目前是6個字符可能更多,但我必須緊挨着一些數字,無論如何我試圖想一個快速的理智的方式來提供給定的長度,在這種情況下,6個字母或數字,並讓它產生一個數組的每個組合az和0-9的長度問題是我想不出來生成這個數組,所以我希望有人能幫助我。

我想出了一種方法來產生img隨機字符串,我選擇了什麼長度,但把它們放入一個數組並不是那麼難,但想出了一個停止點的方法有我。

+1

也許這將有助於張貼您當前的代碼,以澄清問題 – Chronial

+0

這是否有關? [所有固定長度的字符串組合,基於字符集](http://stackoverflow.com/questions/7863781/all-string-combinations-in-a-fixed-length-based-on-a-charset) – hakre

+0

家庭工作號..大聲笑..我所有結束了與本質上是一個無限循環,除非我從一個數字計數。這仍然沒有給我一個明確的停止點,因爲這最終是我想要考慮的因素.. – chris

回答

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

不知道在這種情況下charset和str之間有什麼區別。我能否把美國字母的所有字母,然後所有數字0到9作爲字符集,然後開始我的str,因爲我不知道aaaaaa?和生病得到所有可能的6個字符組合a到z包括0到9?基本上我在考慮採取一個36個字符集,並希望一個6(或多或少,但在這種情況下6)char legth字符串,將在數組中,以供將來使用 – chris

+0

這個數組我將說的將是6個字符組合,這是我現在的最終目標。 – chris

+0

@chris是的,'$ charset'應該是字符串應該包含的一組字符。該函數將計算給定字符串與特定長度的下一個組合。要獲得六個字符長的字母數字字符串的所有組合,可以使用後者的'do ... while'循環。只需設置'$ charset ='a ... z0 ... 9''和'$ str ='aaaaaa''以從第一個組合開始,而不是將字符串轉儲到您的數組中。 – Gumbo

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

你可以在某一點與break聲明退出所有循環。

爲了您的可能性,我建議你用一個迭代器實現它們,並提供一個堆棧,這樣你可以測試,如果你消耗了所有的可能性:

$stackOfAllPossibilities = $possibilities->getStack(); 

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