2015-05-19 76 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