生成带有扭曲的数字字母组合的算法
Algorithm to Generate number letter combinations with a twist
我必须生成一个列表,其中包含长度为 3 的数字和字母的所有可能组合。问题是前两个字符可以是字母或数字,第三个只能是数字。
例如:
AA1, AA2, AA3 .... FC7 ... 001, 002 ... 365)
希望大家能帮帮我。我期待着这些回应。此致,乔希。
到目前为止,我只设法使用一种非常简单的方法来获取所有数字的主要零
for ($k = 0 ; $k < 999; $k++) {
$rnd[] = sprintf('%03d',$k);
}
以下代码完美地满足了我的需求。
$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);
}
这应该适合你:
基本上我有一个包含所有字母的数组 ([A-Z]
) 和一个包含所有数字的数组 ([0-9]
)。然后你定义你想要的可能字符的顺序。例如。这里你想要 letterNumber
, letterNumber
然后第三个位置只有 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 (<b>[A-Z0-9]</b>)
letter = 26 possible characters (<b>[A-Z]</b>)
number = 10 possible characters (<b>[0-9]</b>)
36 * 36 * 10 = 12'960 combinations
代码:
<?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
)
)
我必须生成一个列表,其中包含长度为 3 的数字和字母的所有可能组合。问题是前两个字符可以是字母或数字,第三个只能是数字。
例如:
AA1, AA2, AA3 .... FC7 ... 001, 002 ... 365)
希望大家能帮帮我。我期待着这些回应。此致,乔希。
到目前为止,我只设法使用一种非常简单的方法来获取所有数字的主要零
for ($k = 0 ; $k < 999; $k++) {
$rnd[] = sprintf('%03d',$k);
}
以下代码完美地满足了我的需求。
$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);
}
这应该适合你:
基本上我有一个包含所有字母的数组 ([A-Z]
) 和一个包含所有数字的数组 ([0-9]
)。然后你定义你想要的可能字符的顺序。例如。这里你想要 letterNumber
, letterNumber
然后第三个位置只有 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 (<b>[A-Z0-9]</b>)
letter = 26 possible characters (<b>[A-Z]</b>)
number = 10 possible characters (<b>[0-9]</b>)
36 * 36 * 10 = 12'960 combinations
代码:
<?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
)
)