2012-01-28 93 views
1

我有循環通過多個陣列遞增串的長度

$char=array("1","2","3","4","5","6","7","8","9","0","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","-"); 
$doma=array("aero","asia","biz","cat","com","coop","info","int","jobs","mobi","museum","name","net","org","pro","tel","travel","xxx","edu","gov","mil","co.uk","co.nr","co.au","au","ca","co.cc","cc","co","cn","co.jp","de","es","ie","in","it","jp","nl","nz","ru","co.tk","tk","tv","us") 

,我希望做什麼,是:

從1:1的長度可達32的長度佈置的字符成字符串,回顯字符串,然後再回到開頭。所以最終我的瀏覽器看起來是這樣的:

0.aero 
1.aero 
2.aero 
3.aero 
.... 
x.aero 
y.aero 
z.aero 
-.aero 
00.aero 
01.aero 
02.aero 
.... 
za.aero 
zb.aero 
zc.aero 
zd.aero 
.... 
50x90zx908.aero 
50x90zx909.aero 
50x90zx90a.aero 
50x90zx90b.aero 
.... 
50x90zx910.aero 
50x90zx911.aero 
ect; ect; 

我該如何創建for循環來做到這一點?將$ doma包含到每個循環的最後?

我知道這是巨大的,但是當我有一個想法,我得試試吧;)

+0

該規範有點不清楚,但這個例子表明你需要$ char中長度爲1到32個字符的元素的所有組合,以及希望追加$ doma的每個元素的元素的所有組合。 – 2012-01-30 20:55:07

+0

順便說一句,一旦你有清單,你打算怎麼做? :) – 2012-01-30 20:57:46

+0

即時通訊每一個搜索引擎的標題,描述和關鍵字:P這是我的想法無論如何;) – 2012-02-02 13:29:42

回答

1

如果你真的想與for循環做到這一點,然後讓他們的33,爲每個所需長度(1-32),一個用於$doma陣列。

但我不會這樣做。相反,請注意$char陣列中所需的字符組合實際上構成一棵樹。根節點表示空字符串。根的每個子節點代表1個字符的組合(「1」,「2」,「3」,...)。這些節點的每個子節點都表示一個2字符的組合,它具有其父節點的前綴(因此「1」節點的子節點都將以「1」開頭),依此類推。樹的葉子將是$char中字符的全部32個字符的組合。如果只有三個大字,A,B和C,它會是這個樣子:

Tree example

然後,您可以實現這種樹的深度優先遍歷的遞歸函數,而不是在內存中生成樹並打印它,您可以讓該函數輸出每個節點到達它的內容。拋出一個參數,該參數允許您在節點內容之後放置後綴,並將該函數包裝在遍歷所有$doma中的元素的循環中,然後就完成了。

function f($array, $limit, $suffix, $prefix = "", $counter = 0) 
{ 
    if ($counter > 0) { 
     print "$prefix.$suffix\n"; 
    } 

    if ($counter < $limit) { 
     foreach ($array as $element) { 
      f($array, $limit, $suffix, $prefix . $element, $counter+1); 
     } 
    } 
} 

$char=array("1","2","3","4","5","6","7","8","9","0","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","-"); 
$doma=array("aero","asia","biz","cat","com","coop","info","int","jobs","mobi","museum","name","net","org","pro","tel","travel","xxx","edu","gov","mil","co.uk","co.nr","co.au","au","ca","co.cc","cc","co","cn","co.jp","de","es","ie","in","it","jp","nl","nz","ru","co.tk","tk","tv","us"); 

foreach ($doma as $d) { 
    f($char, 32, $d); 
} 

按照指定的順序將不完全,但這個順序與在陣列和深度優先遍歷順序元素的順序邏輯一致。

+0

這真是太棒了,請問我是否可以請求修改,如果你不介意:) 你可以讓它從某個迭代開始嗎? 例如,如果我通過我做出的小修改來運行該頁面,則頁面停止在8e.com上運行(我拿出所有其他$ doma,因此它只是com)。所以你可以做到這一點,所以它就像page.php?start = 8e或一個id號碼或什麼的?如果它是可能的? – 2012-02-02 11:21:08

-1

的代碼基本上像對待一個基35號的字符組合。它增加了一個循環。

<?php 

    $char=array("1","2","3","4","5","6","7","8","9","0","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","-"); 
    $doma=array("aero","asia","biz","cat","com","coop","info","int","jobs","mobi","museum","name","net","org","pro","tel","travel","xxx","edu","gov","mil","co.uk","co.nr","co.au","au","ca","co.cc","cc","co","cn","co.jp","de","es","ie","in","it","jp","nl","nz","ru","co.tk","tk","tv","us"); 

    $combo = array(0,0,0,0,0,0,0,0,0,0); //this stores the ten "digits" of the characters 
    $pval = 9; //this is the active "place value", the one that you increment 
    $list = ""; 

    for($i=0;$i<44;$i++) { //loops through doma 
     for($j=0;$j<2758547353515625;$j++) { //loops through character combos, that long number is the permutations 

      for($l=0;$l<10;$l++) { //loop displays combo 
       $list .= $char[$combo[$l]]; 
      } 
      $list .= "." . $doma[$i] . "<br/>"; //add combo to list 

      /*This next part check to see if the active digit is 35. It is is, it sets it 
      equal to zero and looks to the digit on the left. It repeats this until it 
      no longer finds a 35. This is like going from 09 to 10 in the decimal system. */ 
      if($combo[$pval] == 35) { 
       while($combo[$pval] == 35) { 
        $combo[$pval] = 0; 
        $pval--; 
       } 
      } 
      $combo[$pval]++; //whatever digit it left on gets incremented. 



      $pval = 9; //reset, go back to first place value 
     } 
     for($l=0;$l<10;$l++) { 
      $combo[$l] = 0; //reset combo for the next top level domain 
     } 
    } 
    echo $list; //print the compiled list. 
    ?> 
+0

你不給這個代碼的任何解釋。首先,你爲什麼在循環中使用'350000000000'(除了這是一個數字限制)? – Bojangles 2012-01-28 21:32:08

+0

這似乎相當複雜,並且還使用大量的內存來保存所有組合的整個字符串。它也不符合規範,它只是在$ char中打印所有10個字符的元素組合。 – 2012-01-30 20:53:23