3

この手紙からコードを生成する必要があります

$a = array(
    'B','C','D','F','G','H','J','K','L','M','N','O',
    'P','Q','R','S','T','V','W','X','Y','Z','1','2',
    '3','4','5','6','7','8','9','0'
);

ただし、2 つの条件があります。すべてのコードは一意で、10 文字を含む必要があります。は非効率的であるため、ランダムになりたくありません。代わりに、すべての文字に行きたいです。

  1. BBBBBBBBBB
  2. BBBBBBBC
  3. BBBBBBBBBD

など..何かアイデアはありますか?

4

4 に答える 4

4

あなたが実際に欲しいのは、かなり非競争的な基本システムを備えた連番のリスト(したがって、まったくランダムではない)だと思います。ですBBBBBBBBB0BBBBBBBCです1。これを行うのは難しいことではありませんが、明らかに自分でコーディングする必要があります。このようなものが機能する可能性があります:

function generate($num) {
    $num = base_convert($num, 10, 32); // convert the number to base 32
    $num = str_pad($num, 10, "0", STR_PAD_LEFT); // pad it with zeros to the left
    $num = str_replace(array(
        '0','1','2','3','4','5','6','7','8','9','a','b',
        'c','d','e','f','g','h','i','j','k','l','m','n',
        'o','p','q','r','s','t','u','v'
    ), array(
        'B','C','D','F','G','H','J','K','L','M','N','O',
        'P','Q','R','S','T','V','W','X','Y','Z','1','2',
        '3','4','5','6','7','8','9','0'
    ), $num); // replace the normal characters with your custom array

    echo $num, "\n";
}

for ($i = 0; $i < 10; $i++) generate($i);

明らか10に、ステートメント内のを好きなように変更して、 ingforではなくデータベースに挿入することができます。echo明らかに、160万件のレコードの生成には時間がかかります。

上記のコードは次の出力を提供します。

BBBBBBBBBB
BBBBBBBBBC
BBBBBBBBBD
BBBBBBBBBF
BBBBBBBBBG
BBBBBBBBBH
BBBBBBBBBJ
BBBBBBBBBK
BBBBBBBBBL
BBBBBBBBBM
于 2012-08-24T08:49:30.810 に答える
3
<?php

$length = 3;

$letters = str_split("ABC"); // define your dictionary here

$index = array_fill(0, $length, 0);

$key = $length - 1;
while(true) {   
    $code = "";
    for($i=0;$i<$length;$i++) {     
        $code .= $letters[$index[$i]];      
    }
    echo $code ."<br/>"; // output code

    $index[$key]++;

    while(!isset($letters[$index[$key]])) {
        $index[$key] = 0;
        $key--;
        if($key < 0) {
            break 2;
        }       
        $index[$key]++;
    }   
    $key = $length - 1; 
}

例:

于 2012-08-24T08:44:01.583 に答える
1
<?php

$a = array(
    'B','C','D','F','G','H','J','K','L','M','N','O',
    'P','Q','R','S','T','V','W','X','Y','Z','1','2',
    '3','4','5','6','7','8','9','0'
);

function key_increment (&$symbols, $position = null) 
{
    global $a;
    if ($position === null) $position = count($symbols) - 1;
    if ($position == -1) return;

    $index = $symbols[$position];
    $index ++;
    if (!isset($a[$index])) {
        $v = 0;
        key_increment ($symbols, $position-1);
    }
    $symbols[$position] = $value;
}

function generate($length, $total) 
{
    global $a;

    $symbols = array_fill(0, $length, 0);


        for ($i = 0; $i < $total; $i ++) {
            $code = '';
        foreach ($symbols as $index) {
            $code .= $a[$index];
        }
        echo $code;
        echo '<br />';

        key_increment($symbols);
    }
}

generate(3, 100);
于 2012-08-24T08:47:36.463 に答える
0

特に 160 万個のコードを生成すると述べたように、uniqid を使用するのがおそらく最善です。ケースが心配な場合は、 strtoupper() を使用してください

echo strtoupper(uniqid());

これらすべてを生成して挿入するには、かなりの時間がかかります。

于 2012-08-24T08:37:16.717 に答える