如何在PHP中生成2个字母和2个数字的所有排列

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

所以,我一直在尝试改编我找到的所有示例,但还没有找到解决方案。 我想要最终得到的是字母和数字组合的所有排列的列表,但输出始终有 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 个数字呢?

php math combinations permutation
1个回答
0
投票

首先将它们分开对待。按(严格?)递增顺序选择 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 种组合。

© www.soinside.com 2019 - 2024. All rights reserved.