2016-06-19 19 views
0

Ich muss eindeutige alphanumerische IDs, 6 Zeichen lang in PHP erstellen.PHP alphanumerische ID mit festen Buchstaben Position

Obwohl ich eine Menge Antworten gefunden habe, um dieses Problem zu lösen, möchte ich, dass die Buchstaben an einer bestimmten Stelle in der ID platziert werden, zum Beispiel A1B2C3 (erstes, drittes und fünftes Zeichen).

Meine einzige Lösung dafür ist, 6 "für" Schleifen (a-z und 0-9 * 3 mal) zu erstellen und die Ausgabe in ein Array und dann in MySQL-Tabelle einzufügen. Es wird definitiv keine Duplikate geben, aber gibt es einen besseren Weg?

bisher Mein Code ist:

<?php 

    $id=array(); 

    for($a='A';$a!='AA';$a++){ 
     for($b=1;$b<=9;$b++){ 
      for($c='A';$c!='AA';$c++){ 
       for($d=1;$d<=9;$d++){ 
        for($e='A';$e!='AA';$e++){ 
        for($f=1;$f<=9;$f++){ 

         $id[]=$a.$b.$c.$d.$e.$f; 
        } 
        } 
       } 
      } 
     } 
    } 

    foreach ($id as $value) { 
     echo "$value \n"; 
    } 
?> 
+1

Bitte fügen Sie Beispieldaten, den Code, den Sie bisher versucht haben und eine Dummy-Ausgabe von dem, was das gewünschte Ergebnis aussehen soll. – SML

+1

'einzigartig' im Vergleich zu was, der DB? Zufällige Lösung, https://eval.in/591689, nicht eindeutig, aber .. – chris85

+0

Meine Frage mit meinem Code aktualisiert. Die DB beginnt leer, also so einzigartig wie die von meinem Code erzeugten Ergebnisse. Mit dem obigen Code bekomme ich keine Duplikate, aber ist das eine gute Methode um meine IDs zu erstellen? –

Antwort

0

Wenn Sie sequenziellen brauchen IDs:

// to start 
//$numIds = 20000; 
//$id = ''; 

// to add more 
$numIds = 1000; 
$id = 'A1J5M2'; // put MAX id from DB here 

if ('' !== $id) { // increment id 
    list($aa, $bb, $cc, $dd, $ee, $ff) = str_split($id); 
    $arr = [$aa, $bb, $cc, $dd, $ee, $ff]; 
    list($aa, $bb, $cc, $dd, $ee, $ff) = incc($arr, count($arr) - 1); 
} 
else { 
    list($aa, $bb, $cc, $dd, $ee, $ff) = ['A',1,'A',1,'A',1]; 
} 

// generate ids  
$ids = []; 

for($a=$aa;$a!='AA';$a++){ 
    for($b=$bb;$b<=9;$b++){ 
    $bb = 1; // reseting b - f is necessary when adding more ids 
    for($c=$cc;$c!='AA';$c++){ 
     $cc = 'A'; 
     for($d=$dd;$d<=9;$d++){ 
     $dd = 1; 
     for($e=$ee;$e!='AA';$e++){ 
      $ee = 'A'; 
      for($f=$ff;$f<=9;$f++){ 
      $ff = 1; 

      $ids[] = "$a$b$c$d$e$f"; 
      // break out of all loops when desired number is reached 
      if ($numIds <= count($ids)) { break 6; } 
}}}}}} 

// db setup 
$conn = mysqli_connect('localhost', 'root', '', 'dbtest'); 
$insertstmt = mysqli_prepare($conn, 'INSERT INTO ids (id) VALUES (?)'); 

// insert ids 
mysqli_stmt_bind_param($insertstmt, 's', $id);  
mysqli_autocommit($conn, false); 
foreach ($ids as $id) { 
    mysqli_stmt_execute($insertstmt); 
} 
mysqli_commit($conn); 
mysqli_close($conn); 


// function to increment given id, accommodates rolling over, e.g., A9 -> B1 
function incc ($arr, $idx) { 
    if (is_int(intval($arr[$idx]))) { 
    if (9 == $arr[$idx]) { 
     $arr[$idx] = 1; 
     $arr = incc($arr, --$idx); // recursing 
    } 
    else { 
     $arr[$idx]++; 
    } 
    } 
    else { 
    if ('Z' === $arr[$idx]) { 
     $arr[$idx] = 'A'; 
     $arr = incc($arr, --$idx); 
    } 
    else { 
     $ord = ord($arr[$idx]); 
     $ord++; 
     $arr[$idx] = chr($ord); 
    } 
    } 
    return $arr; 
} 

PHP Sandbox demo

+0

Vielen Dank für Ihre hilfreiche Antwort. Problem gelöst. Danke noch einmal –

0

Für einzigartige und zufällige IDs, wenn Sie nicht sequenzielle IDs benötigen:

$numIds = 20000; // how many ids do you want to generate and insert? 

// db setup 
$conn = mysqli_connect('localhost', 'root', '', 'dbtest'); 
$insertstmt = mysqli_prepare($conn, 'INSERT INTO ids (id) VALUES (?)'); 

// generate ids array 
$ids = []; 
for ($ii = 0; $ii < $numIds; $ii++) { 
    do { // execute loop at least once 

    // inspired by @chris85 's comment 
    $id = randChr() . rand(0, 9) . randChr() . rand(0, 9) . randChr() . rand(0, 9); 

    } while (// try again if found in either db or array 
    idInDb($conn, $id) || // not actually needed on first run 
    (0 < count($ids) && in_array($id, $ids, true)) 
); 
    $ids[] = $id; // is unique, add to array 
} 

// insert ids 
mysqli_stmt_bind_param($insertstmt, 's', $id);  
mysqli_autocommit($conn, false); 
foreach ($ids as $id) { 
    mysqli_stmt_execute($insertstmt); 
} 
mysqli_commit($conn); 
mysqli_close($conn); 


// helper functions 

function randChr() { // generate random alpha character 
    return chr(rand(65, 90)); // upper case only 
    //return chr(rand(0, 1) ? rand(65, 90) : rand(97, 122)); 
    // use alternative return for upper AND lower case 
} 

function idInDB ($conn, $testid) { // check for id in db 
    $query = "SELECT id FROM ids WHERE id = '$testid'"; 
    $result = mysqli_query($conn, $query); 
    $found = 0 < mysqli_num_rows($result); 
    mysqli_free_result($result); 
    return $found; 
} 

PHP Sandbox demo