PHP - 生成所有可能的排列并执行某些操作

问题描述 投票:0回答:1

我有一组值,说:

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

有什么提示吗?

php permutation
1个回答
0
投票

如果您想生成该列表的每种可能的组合(最多一定数量的数字),那么您可以通过使用幂关系和模来实现。

对于迭代

$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;
}
© www.soinside.com 2019 - 2024. All rights reserved.