1

長さ 3 の数字と文字の可能なすべての組み合わせのリストを生成する必要があります。問題は、最初の 2 文字は文字または数字にすることができ、3 番目の文字は数字のみにすることができることです。

例えば:

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

皆さんが私を助けてくれることを願っています。これらの反応を楽しみにしています。よろしく、ジョシュ。

これまでのところ、一般的なゼロですべての数値を取得する非常に簡単な方法しか管理できませんでした

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

2 に答える 2

2

これはあなたのために働くはずです:

基本的に、すべての文字[A-Z]の配列 ( ) とすべての数字の配列 ( [0-9]) があります。次に、使用可能な文字の順序を定義します。たとえば、ここであなたが望むletterNumberletterNumberそして 3 番目のスポットのみnumber

この後、必要な組み合わせごとに文字の数だけすべてをループします(例: XXX -> 3 times)。ループでは、この場所で必要なすべての文字を使用して、既に持っているすべての組み合わせを調べます。


したがって、1回の反復の後、各組み合わせの最初の文字を含む配列が得られます。これは次のようになります[0-9A-Z]

次に、2 番目の繰り返しで、既に持っているすべての組み合わせを調べます。ここ[0-9A-Z]では、2 番目の場所で必要な文字を使用します[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
        )

)

Demo

于 2015-05-19T17:48:39.750 に答える
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);
}
于 2015-05-19T17:41:56.060 に答える