我有一组值,说:
0,1,2,3,4,5,6,7,8,9,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
我想生成所有可能的8位密钥:
00000000
00000001
00000002
...
zzzzzzzy
zzzzzzzz
但是找到的所有解决方案都尝试分配数组,并且 PHP 内存不足。
所以我想做点什么:
// LOOPS
// generate 1 permutation
// do something
// END LOOP
有什么提示吗?
如果您想生成该列表的每种可能的组合(最多一定数量的数字),那么您可以通过使用幂关系和模来实现。
对于迭代
$i
,最后一位数字由 $i % $numValues
给出
对于迭代
$i
,最后一位数字由 intval($i / $numValues) % $numValues
给出
对于迭代
$i
,最后两位数字由 intval($i / ($numValues * $numValues)) % $numValues
给出
对于迭代
$i
,最后一位三位数字由 intval($i / ($numValues * $numValues * $numValues)) % $numValues
给出
...等等。
概括地说,您可以将其设置为循环:
// list of values to use
$values = [0,1,2,3,4,5,6,7,8,9,'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'];
$numValues = count($values);
// number of digits in each iteration
$numDigits = 8;
$numIterations = $numValues ** $numDigits - 1;
for ($i = 0; $i <= $numIterations; $i++) {
$str = '';
for ($d = $numDigits - 1; $d >= 0; $d--) {
$str .= $values[intval($i / ($numValues ** $d)) % $numValues];
}
// iteration is now in $str
// do something with $str ...
echo $str . PHP_EOL;
}