2012-08-24 179 views
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. BBBBBBBBBC
  3. BBBBBBBBBD

等..任何想法?

+0

爲什麼不使用像'uniqid'?我可以保證這比自己建立絃樂更有效率。 – lonesomeday

+0

我需要生成1,6mln代碼並將它們保存到數據庫。如何使用uniqid? – ariel

回答

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); 
+0

@PeterSzymkowski,是的,但它清晰顯示它必須如何工作。寂寞的日子的問題更喜歡 – Sergey

+0

這段代碼顯然有效,但它很難遵循。你認爲你可以使用描述性變量名稱,而不是'$ s','$ v'等。 – lonesomeday

+0

@lonesomeday,謝謝你,好點,已經更新我的答案 – Sergey

0

這可能是最好的,你只是使用uniqid,尤其是看到你說你會產生160萬個代碼。如果你擔心的情況下,只需使用strtoupper()

echo strtoupper(uniqid()); 

生成所有這些和插入他們是要採取的時間公平位。

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; 
} 

例子:

+0

很好的解決方案,但替換:$ index = Array(); ($ i = 0; $ i <$ length; $ i ++){index} [$ i] = 0; } by $ index = array_fill(0,$ length,0); - – Sergey

+0

值得一提的是,[這裏](http://codepad.org/L4AL9ltX)是OP所要求的格式和字典的鍵盤。這確實比我的解決方案顯着(5到10倍),所以很大的+1。 – lonesomeday

4

我認爲你真正想要的是(因此不是隨機的話)序列號的列表,並附有相當unconvetional基地系統。所以BBBBBBBBB0,而BBBBBBBC1。這並不難,但顯然你必須自己編寫代碼。像這樣的東西可能會奏效:

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); 

很明顯,你可以在for聲明改變10任何你喜歡,並插入到數據庫中,而不是echo ING。很明顯,需要一些時間才能生成160萬條記錄。

上面的代碼提供了以下的輸出:

BBBBBBBBBB 
BBBBBBBBBC 
BBBBBBBBBD 
BBBBBBBBBF 
BBBBBBBBBG 
BBBBBBBBBH 
BBBBBBBBBJ 
BBBBBBBBBK 
BBBBBBBBBL 
BBBBBBBBBM 
+0

聰明的解決方案,但是很慢 – Peter

+0

@PeterSzymkowski好的。但讓我們面對現實:如果速度是目標,解決方案是使用普通的舊數字。 – lonesomeday

+0

+1,絕對是完成工作的最簡單的答案。有一件事需要考慮(這適用於任何方法),因爲您需要將它存儲在數據庫中,因爲使用生成的值填充數組會消耗大量的內存。 – DaveRandom