PHP数组收集

PHP数组收集,php,arrays,collect,Php,Arrays,Collect,我有24个字符的字母表数组:“A B C D E F G H I J K L M N O p Q R S T U V W X” 我想收集所有案件:3个独特的字符 第一例:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX; $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; $c = strlen($alphabet); $result = array(); for ($i = 0; $i < $c; ++$i) { $current0

我有24个字符的字母表数组:“A B C D E F G H I J K L M N O p Q R S T U V W X”

我想收集所有案件:3个独特的字符

第一例:ABC、DEF、GHI、JKL、MNO、PQR、STU、VWX;
$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$c = strlen($alphabet);
$result = array();

for ($i = 0; $i < $c; ++$i) {
    $current0 = $i;
    for ($j = 0; $j < $c; ++$j) {
        if ($current0 == $j) continue;
        $current1 = $j;
        for ($k = 0; $k < $c; ++$k) {
            if (isset($current0 == $k || $current1 == $k)) continue;
            $result[] = $alphabet[$i].$alphabet[$j].$alphabet[$k];
        }
    }
}
$c=strlen($alphabet); $result=array(); 对于($i=0;$i<$c;++$i){ $current0=$i; 对于($j=0;$j<$c;++$j){ 如果($current0==$j)继续; $current1=$j; 对于($k=0;$k<$c;++$k){ 如果(isset($current0==k | |$current1==k))继续; $result[]=$alphabet[$i]。$alphabet[$j]。$alphabet[$k]; } } } 希望我没弄错你的问题。这个循环在字母表上循环三次,并且总是跳过已经使用的字符。然后我将结果推到$result

但是最好用五个字母试试剧本;)使用alls strlen($alphabet)(现在不想数数…)将需要非常多的内存


(我确信有一些黑客版本比这更快,但我认为这是最简单的。)

字母表中字母的排列与集合列表之间存在1:1的关系。基本上,一旦你有了字母表的排列,你只需要调用
array\u chunk
就可以得到集合


现在,24岁!任何东西中的任何一个(即620448401733239439360000)都无法放入内存(无论是RAM还是磁盘),因此您最好在
1
24之间生成一个数字
n
(排列编号),然后生成此类排列。关于最后一步,请参阅示例和引用的论文。

这有点晚了,但对于阅读本文的其他人来说:如果您希望将字符串拆分为3个字符的块,请尝试PHP的内置函数。它接受
$string
$split\u length
参数。例如:

$alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWX';
$grouped  = str_split($alphabet, 3);

var_export( $grouped );
这将输出以下数组:

array ( 0 => 'ABC', 1 => 'DEF', 2 => 'GHI', 
        3 => 'JKL', 4 => 'MNO', 5 => 'PQR', 
        6 => 'STU', 7 => 'VWX', )

这适用于问题中给出的示例。如果你想得到这24个字母的所有可能的组合,Artefactor的答案更有意义。

你想把所有的间隔都分成子数组,每个子数组正好包含3个元素?顺序重要吗。例如,DEF、ABC、GHI、JKL、MNO、PQR、STU、VWX是否与您提供的相同?(对于现有的24个!这样的集合列表,它一定是不同的)我建议看一下和。@Jamie Wong:是的,我想要“生成277 743 578 112 000个集合”或4个字符或12个字符集合…@B11002您实现了24个!其数量级为10^24。PB仅为10^15字节…如果我想要设置4个字符或12个字符,则此函数不太好,因为“$alphabet[$I]。$alphabet[$j]。$alphabet[$k]”抱歉,您认为只有在第一种情况下才需要三个唯一字符数组块。我不在乎记忆问题。我们可以减少24到6个字符。你能解释一下php函数中的“生成一个介于1和24之间的数字n!(排列数)”吗?@B11如果你能减少到6个字符,请看一看。@B11顺便说一句,如果你只想生成所有排列,有更简单的方法。。。请参阅Java中的一个列表。我觉得这个问题实际上是在询问如何将字符串拆分为3个字符的块(“ABC”、“DEF”),并保持相同的顺序。找不到这些角色可以进行的所有排列。