生成带扭曲的数字字母组合的算法

时间:2015-05-19 17:24:14

标签: php algorithm combinations letters-and-numbers

我必须生成一个包含长度为3的数字和字母的所有可能组合的列表。捕获的前两个字符可以是字母或数字,第三个字符只能是数字。

例如:

AA1, AA2, AA3 .... FC7 ... 001, 002 ... 365)

我希望你们都能帮助我。我期待着这些回应。此致,乔什。

到目前为止,我只管理了一个非常简单的方法来获得所有数字的主流零

for ($k = 0 ; $k < 999; $k++) {
     $rnd[] = sprintf('%03d',$k);
}

2 个答案:

答案 0 :(得分:2)

这应该适合你:

基本上我有一个包含所有字母([A-Z])的数组和一个包含所有数字([0-9])的数组。然后,您可以定义所需的可能字符顺序。例如。在这里,您需要letterNumberletterNumber,然后只需要第三个地点number

在此之后,您可以循环浏览所需的每个组合的字符数(例如XXX -> 3 times)。在循环中,您将浏览所有已经拥有的所有组合的组合。


因此,在1次迭代之后,您将拥有一个包含每个组合的第一个字符的数组,其中包括:[0-9A-Z]

然后在第二次迭代中,您将浏览已有的所有组合,此处为[0-9A-Z],其中包含您在第二个位置所需的字符,此处为[0-9A-Z]。因此,对于组合数组中的任何字符([0-9A-Z]),您将获得[0-9A-Z]的每个字符的新组合。

这一遍又一遍地重复,直到你达到预期的组合长度。

所以最后你最终得到:

letterNumber = 36 = 26 + 10 possible characters ([A-Z0-9])
letter = 26 possible characters ([A-Z])
number = 10 possible characters ([0-9])
  

36 * 36 * 10 = 12&#9; 960种组合

代码:

<?php

    $letters = range("A", "Z");
    $numbers = array_merge(range(0, 9));
    $order = ["letterNumber", "letterNumber", "number"]; //possibilities: "letter", "number", "letterNumber"

    $length = count($order);
    $combinations = [[]];



    for($count = 0; $count < $length; $count++) {
        $tmp = [];

        if($order[$count] == "number" || $order[$count] == "letterNumber") {
            foreach($combinations as $combination) {
                foreach($numbers as $v)
                    $tmp[] = array_merge($combination, [$v]);
            } 
        }
        if($order[$count] == "letter" || $order[$count] == "letterNumber") {
            foreach($combinations as $combination) {
                foreach($letters as $v)
                    $tmp[] = array_merge($combination, [$v]);
            }
        }

        $combinations = $tmp;

    }

    print_r($combinations);

?>

输出:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
        )

    [1] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 1
        )
    //...


    [12959] => Array
        (
            [0] => Z
            [1] => Z
            [2] => 9
        )

)

Demo

答案 1 :(得分:1)

以下代码完美适用于我所追求的目标。

$letters = range('A', 'Z');
$comb = array();
for ($k = 0 ; $k <= 9; $k++) {
    foreach($letters as $l){
        foreach($letters as $le){
            $comb[]= $l.$le.$k;
        }
    }
}
for ($k = 0 ; $k <= 999; $k++) {
    $comb[] = sprintf('%03d',$k);
}