2012-01-28 61 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