2012-08-24 143 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