Алгоритм генерации числовых буквенных комбинаций с поворотом

Я должен составить список всех возможных комбинаций цифр и букв длины три. Подвох на первых двух символах может быть буквами или цифрами, а третий может быть только числовым.

Например:

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

Я надеюсь, что вы все можете мне помочь. Я с нетерпением жду этих ответов. С уважением, Джош.

До сих пор мне удался только очень простой способ получить все числа с преобладающими нулями

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

1

Решение

Это должно работать для вас:

В основном у меня есть массив со всеми буквами ([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 ([A-Z0-9])
letter = 26 possible characters ([A-Z])
number = 10 possible characters ([0-9])

36 * 36 * 10 = 12’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
)

)

демонстрация

2

Другие решения

Следующий код работал отлично для того, что я был после.

$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);
}
1

По вопросам рекламы [email protected]