假设我有一个由这些范围“a-zA-Z0-9”中的字符组成的数组。我想要做的是在4个字母范围内获得所有可能的组合。可以在字符串中重复字符。我正在寻找一种蛮力的方式去做。
这就是我相信迭代的方式:
“AAAA” “AAAB” “AAAC” ... “9999”
答案 0 :(得分:0)
以蛮力的方式:
$chars = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
$cnt = count($chars);
$strings = array();
for ($first = 0; $first < $cnt; $first++) {
for ($second = 0; $second < $cnt; $second++) {
for ($third= 0; $third< $cnt; $third++) {
for ($fourth= 0; $fourth < $cnt; $fourth++) {
$strings[] = $chars[$first] . $chars[$second] . $chars[$third] . $chars[$fourth];
}
}
}
}
你最终会得到一个honkin'大数组,所以你可能想要将一些数据库操作洒入其中一个循环中,所以$ strings不会太大并且通过达到内存限制来杀死你的脚本。 / p>
答案 1 :(得分:0)
随机访问你可以使用base_convert:
function getHash($i)
{
//- allowed Letters
$letters = 'aAbBcCdDeEfFgG';
$len = strlen($letters);
//- convert $i to base of $letters
$i_in_base_of_letter = base_convert($i, 10, $len);
//- replace letters
return strtr($i_in_base_of_letter, '0123456789abcdefghijklmnopqrstuvwxyz', $letters);
}
或manuel如果你的基数大于36(你有超过36个Chars)
function getHash($i)
{
//- allowed Letters
$letters = 'aAbBcCdDeEfFgG';
$letters_arr = str_split($letters, 1);
$len = strlen($letters);
$out ='';
if ($i>0)
{
while ($i>0)
{
$r = $i % $len;
$out = $letters_arr[$r] . $out;
$i = floor ($i / $len);
}
return $out;
}
else
{
return $letters_arr[0];
}
}
迭代你可以使用:
for($i=0; $i<100; $i++)
{
echo getHash($i) ."\n";
}
这种方式并不像蛮力方法那么快。
关心托马斯