2012-06-19 91 views
0

我想建立一個PHP腳本,由1 增加之前的自動生成一個新的ID如:A0009變得A0010和A9999成爲B0000自動增加ID

我寫了一個工程,但它不超過5個字符長: 例如:Z9999應該去A00000等。

有什麼建議嗎? 這裏是我的代碼片段:

<?php 
function replaceChar($string2replace) 
{ 
$charLength = strlen($string2replace)-1; 
$charAt = array(); 
$charAt[4] = substr($string2replace, -1); 
$charAt[3] = substr($string2replace, -2,1); 
$charAt[2] = substr($string2replace, -3,1); 
$charAt[1] = substr($string2replace, -4,1); 
$charAt[0] = substr($string2replace, 0,1); 

if($charAt[4] < 9) 
{ 
$string2replace = substr_replace($string2replace,$charAt[4]+1,$charLength); 
} 
else 
{ 
$charAt[4] = 0; 
$string2replace = substr_replace($string2replace,$charAt[4],$charLength); 
    if($charAt[3] < 9) 
{ 
$string2replace = substr_replace($string2replace,$charAt[3]+1,$charLength- 1,1); 
} 
else 
{ 
$charAt[3] = 0; 
$string2replace = substr_replace($string2replace,$charAt[3],$charLength-1,1); 

if($charAt[2] < 9) 
{ 
$string2replace = substr_replace($string2replace,$charAt[2]+1,$charLength-2,1); 
} 
else 
{ 
$charAt[2] = 0; 
$string2replace = substr_replace($string2replace,$charAt[2],$charLength-2,1); 

if($charAt[1] < 9) 
{ 
$string2replace = substr_replace($string2replace,$charAt[1]+1,$charLength-3,1); 
} 
else 
{ 
$charAt[1] = 0; 
    $string2replace = substr_replace($string2replace,$charAt[1],$charLength-3,1); 
    } 

if($charAt[0] < 'z') 
{ 
$charAt[0] ++; 
$string2replace = substr_replace($string2replace,$charAt[0],$charLength-4,1); 
} 
else 
{ 
$charAt[0] = 'a'; 
$string2replace = substr_replace($string2replace,$charAt[0],$charLength-4,1); 
} 
} 
} 
} 
return $string2replace; 
} 

$string2begin = 'A9999'; 

$generatedString = replaceChar($string2begin); 

echo $string2begin . "<br />" . $generatedString; 


?> 
+0

是你的id列是一個純粹的十六進制值嗎?什麼是低於A000的? –

+1

爲什麼不A9999 + 1 = A999A? – Wiseguy

+0

@Gustav:它顯然不是「純十六進制」,因爲提到了'Z9999'的值。除非最近事情發生了變化,否則'Z'不是有效的十六進制數字。 :-) –

回答

3

你的ID編號方案看起來相當做作,其中高階位是A-Z,其餘數字是0-9。如果我沒有理解這個模式,這似乎這樣的伎倆:

function incrementID($id) 
{ 
    $letter = $id[0]; 
    $number = substr($id, 1); 

    $newNum = str_pad($number + 1, strlen($number), '0', STR_PAD_LEFT); 

    // increase number only 
    if (strlen($number) == strlen($newNum)) 
     return $letter . $newNum; 

    // increase ID length ('Z' to 'A') 
    if ($letter == 'Z') 
     return 'A' . str_repeat('0', strlen($number) + 1); 

    // change letter 
    $newLetter = chr(ord($letter) + 1); 
    return $newLetter . str_repeat('0', strlen($number)); 

} 

printf("%s\n", incrementID('A0009')); // 'A0010' 
printf("%s\n", incrementID('A9999')); // 'B0000' 
printf("%s\n", incrementID('Z9999')); // 'A00000' 

即使你的例子不適合這個,我先假設你真的只是想一個基本數36(任何數字可能是0-9,A-Z,其中A是10並且Z是35)。使用base-36中的數字很容易,因爲您可以使用base_convert()將它們轉換爲習慣上的base-10。這就是你需要做的36個數字的增量:

function incrementBase36($id) 
{ 
    $numVal = base_convert($id, 36, 10); 
    $newId = base_convert($numVal + 1, 10, 36); 
    return strtoupper($newId); 
} 

printf("%s\n", incrementBase36('A0009')); // 'A000A' 
printf("%s\n", incrementBase36('A9999')); // 'A999A' 
printf("%s\n", incrementBase36('Z9999')); // 'Z999A' 
printf("%s\n", incrementBase36('AZZZZ')); // 'B0000' 
printf("%s\n", incrementBase36('ZZZZZ')); // '100000' 
+0

非常感謝您的回答,是的,這回答我的問題 –