2015-05-19 96 views
1

我必须生成长度为三的数字和字母的所有可能组合的列表。上面的两个字符可以是字母或数字,第三个字符只能是数字。生成带扭曲的数字字母组合的算法

例如:

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

我希望大家都可以帮助我。我期待着这些回应。问候,乔希。

到目前为止,我只管理一个非常简单的方式来获得所有号码通行的零

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

你尝试过什么吗? – Rizier123

+0

那么,你尝试了什么? –

+0

以上编辑我到目前为止得到的.. – jburley89

回答

2

这应该为你工作:

基本上我有所有的字母([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 
     ) 

) 

Demo

+1

谢谢你的回答,但我从字面上刚刚发现了一个解决方案,因为我张贴在上面。非常感谢:)非常感谢。由于良好的信息和更好的变量名称,我将您标记为正确的答案。 – jburley89

+0

@ jburley89更新了我的答案;在其中有几个拼写错误,并只将字母改为大写字母。 – Rizier123

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

您的解决方案不完整。你*缺少5000个结果*,例如查找'C49'。你可以放弃最后一个循环(使用'sprintf'),你必须扩展你的范围:'$ letters = array_merge(range('A','Z'),range(0,9));'。 – insertusernamehere

+1

@insertusernamehere他缺少5'200种组合,大约是所有组合的一半(12'960):) – Rizier123

+0

同意这里有很多缺失。感谢您指出了这一点。我已经接受了正确的答案。 – jburley89