如何在php中输出所有可能的字符串(39个非十亿字符串)混合符号输出一个站点地图
我有用户帐户规则是限制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();
任务非常微不足道。你不需要单独的字符集,只需要单个字母并遍历所有可能的组合:
<?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;
}
谢谢!这正确打印字符串。但我执行此,长度设置20有错误'最大执行时间30秒',我发现http://stackoverflow.com/a/15904047/1927742。但如上@Jimmy T.的评论我应该这样做? – vibskov
好吧,这个操作需要时间,你应该使用'ini_set('max_execution_time',0);'来防止超时终止。 –
它是否有助于OP指定预期组合的大概总数,以及以每秒100万个组合的速度完成多长时间?只是让他们知道等待答案需要多长时间? –
我会把所有的字母放到*一个*数组中。然后检查这个:http://docstore.mik.ua/orelly/webprog/pcook/ch04_26.htm ..然而,在你的情况下,它将**许多**排列。 – hek2mgl
这将是38^20 = 39非亿字符串。不可能。 –
继续@JimmyT。说,*为什么*你需要打印*所有*组合? – Abhay