我有字母阵列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
我有字母阵列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
有一个1:英文字母和你组的排列1间之间的关系名单。基本上,一旦你有一个排列的字母表,你只需要拨打array_chunk
来获得集。
现在,24!任何东西(即620448401733239439360000)永远不会适合内存(无论是RAM还是磁盘),所以最好做的是在1
和24!
(置换数)之间生成n
,然后生成这样的置换。对于最后一步,请参阅例如Generation of permutations following Lehmer and Howell及其引用的论文。
array_chunk。 我不在乎内存问题。我们可以减少24到6个字符。你能解释一下“在1到24之间生成一个数字n(排列数)”在php函数中吗? – B11002 2010-07-10 15:37:26
@ B11如果您可以减少到6个字符,请查看['mt_rand'](http://www.php.net/mt_rand)。 – Artefacto 2010-07-10 15:59:53
@ B11顺便说一句,如果你只是想产生所有的排列,有更简单的方法来做到这一点...... [这里](http://www.merriampark.com/perm.htm)获取Java中的列表。 – Artefacto 2010-07-10 16:01:25
$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)(现在不想计数......)需要难以置信的内存。
(我相信有一些哈克版本,这是比快,但是这是最简单的,我认为)。
这有点晚了,但对于其他读者来说:如果你正在寻找一个字符串分成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的答案更有意义。
你想把所有的分离都变成每个包含3个元素的子阵列吗? – phimuemue 2010-07-10 15:07:56
订单是否重要。例如,DEF,ABC,GHI,JKL,MNO,PQR,STU,VWX是否与您给与否相同? (它必须是不同的现有24!这样的集列表) – Artefacto 2010-07-10 15:07:56
我会建议看看[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