所以,我一直在尝试改编我找到的所有示例,但还没有找到解决方案。 我想要最终得到的是字母和数字组合的所有排列的列表,但输出始终有 2 个字母和 2 个数字(按所有顺序)。
到目前为止我所拥有的是:
function combinations($arrays, $i = 0) {
if (!isset($arrays[$i])) {
return array();
}
if ($i == count($arrays) - 1) {
return $arrays[$i];
}
// get combinations from subsequent arrays
$tmp = combinations($arrays, $i + 1);
$result = array();
// concat each array from tmp with each element from $arrays[$i]
foreach ($arrays[$i] as $v) {
foreach ($tmp as $t) {
$result[] = is_array($t) ?
array_merge(array($v), $t) :
array($v, $t);
}
}
return $result;
}
$letters = array("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");
$numbers = array("0","1","2","3","4","5","6","7","8","9");
$combinations = combinations(array( $letters, $letters, $numbers, $numbers));
foreach ($combinations as $values) {
echo implode("",$values).'<br>';
}
但是这只输出结果的顺序是先有 2 个字母,后跟两个数字。
还有额外的问题,我如何计算我应该期望的总结果,我知道如果都是字母,那就是 26x26x26x26 所以只有 4 个字母我会期望 456,976,但是 2 个字母和 2 个数字呢?
首先将它们分开对待。按(严格?)递增顺序选择 2 个数字,然后按(严格?)递增顺序选择 2 个字母,并计算结果的所有排列。它们是否严格递增取决于您是否希望两个数字或两个字母都相同。
对于允许两个数字或字母相同的情况,您有
不。 (不严格)递增的数字对 P_Num = 1 + ... + 10 = 55。 (不严格)递增字母对的数量 P_Let = 1 + ... + 26 = 351。
对于不允许两个数字或字母相同的情况,你有
不。严格递增的数字对 P_Num = 1 + ... + 9 = 45。 严格递增字母对的数量 P_Let = 1 + ... + 25 = 325。
有4个! = 4 个不同元素的 24 种排列,给出 2445325 = 351,000 种组合。
两个数字相同的情况有10种,假设字母不同,则2个相同的4个元素的排列数为4!/2! = 12 给出另外 1232510 = 39,000 种组合。
两个字母相同的情况有26种,假设数字不相同,则2个相同的4个元素的排列数为4!/2! = 12 给出另外 124526 = 14,040 种组合。
两个字母和数字相同的情况有 260 种,其中 2 对相同的 4 个元素的排列数为 4!/(2! * 2!) = 6,即另外 6*260 = 1,560 个组合。
所以,如果你允许字母和数字相同,你就拥有了
351,000 + 39,000 + 14,040 + 1,560 = 405600 种组合。