2015-04-12 54 views
1

我有用戶帳戶規則是限制20個符號可以是字母,句點,下劃線和數字。
q1。如何打印所有可能的字符串?下面是我的代碼我找不到混合不同符號的方式
q2。這是正確的方式打印網站的網站地圖,因爲它是39非貨幣字符串,我發現https://stackoverflow.com/a/1099421,但我需要知道更多的細節瞭解通常人們如何做到這一點?如何在php中輸出所有可能的字符串(39個非十億字符串)混合符號輸出一個站點地圖

$letters = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'); 
$period = array('.'); 
$underscore = array('_'); 
$numbers = array('0','1','2','3','4','5','6','7','8','9'); 

for ($i=0; $i < count($letters); $i++) { 
    for ($ii=0; $ii < count($period); $ii++) { 
    for ($iii=0; $iii < count($underscore); $iii++) { 
     for ($iiii=0; $iiii < count($numbers); $iiii++) { 
     // echo $numbers[$iiii]+$letters[$i]+ ... 
     } 
    } 
    } 
} 

編輯:
下面的回答我嘗試做一個XML站點地圖中,但它循環只有一個符號長度的基礎?

$domDocument = new DOMDocument('1.0', 'UTF-8'); 

$domElementUrlSet = $domDocument->createElement('urlset'); 
$domElementUrlSet->appendChild(
    new DomAttr('xmlns', 'http://www.sitemaps.org/schemas/sitemap/0.9') 
); 

$domDocument->appendChild($domElementUrlSet); 



$chars = array(
    'a','b','c','d','e','f','g','h', 
    'i','j','k','l','m','n','o','p', 
    'q','r','s','t','u','v','w','x', 
    'y','z','.','_','0','1','2','3', 
    '4','5','6','7','8','9' 
); 
$length = 2; 
$charsLength = count($chars); 
$current = array_fill(0, $length, -1); 
$end = array_fill(0, $length, $charsLength - 1); 

while ($current != $end) { 
    // increment current state 
    $n = $length; 
    while ($n-- >= 0) { 
     $current[$n]++; 
     if ($current[$n] == $charsLength) { 
      $current[$n] = 0; 
     } else { 
      break; 
     } 
    } 
    // print string 
    for ($i=0; $i < $length; $i++) { 
     if ($current[$i] >= 0) { 
     // echo $chars[$current[$i]]; 

     $url = $domDocument->createElement('url'); 
     $url->appendChild($loc = $domDocument->createElement('loc', 'http://www.example.com/'.$chars[$current[$i]])); 

     $domElementUrlSet->appendChild($url); 
     } 
    } 
    // echo PHP_EOL; 
} 

echo $domDocument->saveXML(); 
+0

我會把所有的字母放到*一個*數組中。然後檢查這個:http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm ..然而,在你的情況下,它將**許多**排列。 – hek2mgl

+3

這將是38^20 = 39非億字符串。不可能。 –

+0

繼續@JimmyT。說,*爲什麼*你需要打印*所有*組合? – Abhay

回答

0

任務非常微不足道。你不需要單獨的字符集,只需要單個字母並遍歷所有可能的組合:

<?php 
$chars = array(
    'a','b','c','d','e','f','g','h', 
    'i','j','k','l','m','n','o','p', 
    'q','r','s','t','u','v','w','x', 
    'y','z','.','_','0','1','2','3', 
    '4','5','6','7','8','9' 
); 
$length = 20; 
$charsLength = count($chars); 
$current = array_fill(0, $length, -1); 
$end = array_fill(0, $length, $charsLength - 1); 

while ($current != $end) { 
    // increment current state 
    $n = $length; 
    while ($n-- >= 0) { 
     $current[$n]++; 
     if ($current[$n] == $charsLength) { 
      $current[$n] = 0; 
     } else { 
      break; 
     } 
    } 
    // print string 
    for ($i=0; $i < $length; $i++) { 
     if ($current[$i] >= 0) echo $chars[$current[$i]]; 
    } 
    echo PHP_EOL; 
} 
+0

謝謝!這正確打印字符串。但我執行此,長度設置20有錯誤'最大執行時間30秒',我發現http://stackoverflow.com/a/15904047/1927742。但如上@Jimmy T.的評論我應該這樣做? – vibskov

+0

好吧,這個操作需要時間,你應該使用'ini_set('max_execution_time',0);'來防止超時終止。 –

+1

它是否有助於OP指定預期組合的大概總數,以及以每秒100萬個組合的速度完成多長時間?只是讓他們知道等待答案需要多長時間? –

相關問題