2010-07-10 92 views
0

我有字母阵列24字符: “A B C d E F G H I J K L M N 2 O P Qř式T U V W X”PHP阵列收集

欲收集与所有情况下:3个唯一的字符。

第一种情况:ABC,DEF,GHI,JKL,MNO,PQR,STU,VWX

+0

你想把所有的分离都变成每个包含3个元素的子阵列吗? – phimuemue 2010-07-10 15:07:56

+1

订单是否重要。例如,DEF,ABC,GHI,JKL,MNO,PQR,STU,VWX是否与您给与否相同? (它必须是不同的现有24!这样的集列表) – Artefacto 2010-07-10 15:07:56

+0

我会建议看看[array_chunk](http://www.php.net/manual/en/function.array-chunk.php)和[array_unique]( http://www.php.net/manual/en/function.array-unique.php)。 – 2010-07-10 15:10:18

回答

0

有一个1:英文字母和你组的排列1间之间的关系名单。基本上,一旦你有一个排列的字母表,你只需要拨打array_chunk来获得集。

现在,24!任何东西(即620448401733239439360000)永远不会适合内存(无论是RAM还是磁盘),所以最好做的是在124!(置换数)之间生成n,然后生成这样的置换。对于最后一步,请参阅例如Generation of permutations following Lehmer and Howell及其引用的论文。

+0

array_chunk。 我不在乎内存问题。我们可以减少24到6个字符。你能解释一下“在1到24之间生成一个数字n(排列数)”在php函数中吗? – B11002 2010-07-10 15:37:26

+0

@ B11如果您可以减少到6个字符,请查看['mt_rand'](http://www.php.net/mt_rand)。 – Artefacto 2010-07-10 15:59:53

+0

@ B11顺便说一句,如果你只是想产生所有的排列,有更简单的方法来做到这一点...... [这里](http://www.merriampark.com/perm.htm)获取Java中的列表。 – Artefacto 2010-07-10 16:01:25

0
$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]; 
     } 
    } 
} 

希望我理解你的问题的权利。这个循环遍历三个循环中的字母,并且总是跳过已经使用的字符。然后我将结果推送到$ result。

但是最好只用五个字母来尝试一下脚本;)使用alls strlen($ alphabet)(现在不想计数......)需要难以置信的内存。

(我相信有一些哈克版本,这是比快,但是这是最简单的,我认为)。

+0

这个函数不好,如果我想设置4个字符或12个字符,因为“$ alphabet [$ i] 。$ alphabet [$ j]。$ alphabet [$ k]“ – B11002 2010-07-10 15:26:47

+0

对不起,以为你只想为第一种情况设置唯一字符的三元组 – NikiC 2010-07-10 15:30:56

0

这有点晚了,但对于其他读者来说:如果你正在寻找一个字符串分成3个字符的块,尝试内置str_split()功能的PHP。它需要一个$string$split_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个字母的所有可能的组合,Artefacto的答案更有意义。