2012-02-06 73 views
0

我工作的一些東西,需要唯一的ID號這是在格式:非典型字母和數字遞增

[AZ] [A-Z0-9] [A-Z0-9] [ A-Z0-9] [A-Z0-9] [A-Z0-9]

而且增量爲:

AAAAAA,AAAAAB,... AAAAAZ,AAAAA0,AAAAA1。 。AAAAA9,AAAABA,AAAABB

我知道我可以在PHP中增加字母,但是如何以這種方式來做字母和數字?

特別說明,baseconvert不是一個選項,因爲它必須始終正好是6個字符,並且逐漸適合註釋的格式。此外,baseconvert從0開始,而不是A,所以如果我確實從「621937810」(AAAAAA)開始,則下一次跳轉將在AAAAAZ之後並且繼續到AAAAB0。這似乎是最快的解決方案,但它不起作用。

回答

2

你可以嘗試base_convert從36到10,然後增加10到36.我沒有任何問題,像ZZZZZW+1這樣的大數字,但正如它在php手冊中所說的那樣,浮動/雙精度。

<?php 
echo "<pre>"; 
//orig string 
$test = 'ZZZZZW'; 

//convert from base36 to number. 
$test = base_convert($test, 36, 10); 
var_dump($test); 

//increment 
$test++; 
var_dump($test); 

//convert back (and upper case) 
$test = strtoupper(base_convert($test, 10, 36)); 
var_dump($test); 
?> 

輸出:

string(6) "ZZZZZW" 
string(10) "2176782332" 
float(2176782333) 
string(6) "ZZZZZX" 

example can be see here

除此之外,你可以做一些自定義的增量,甚至檢查出把一些較大的基地和值在PHP手冊的base_convert意見。澄清後

編輯:

Taken from the php comments page

<?php 
function intToAlphaBaseN($n,$baseArray) { 
    $l=count($baseArray); 
    $s = ''; 
    for ($i = 1; $n >= 0 && $i < 10; $i++) { 
     $s = $baseArray[($n % pow($l, $i)/pow($l, $i - 1))].$s; 
     $n -= pow($l, $i); 
    } 
    return $s; 
} 

$base=array_merge(range('A','Z'), range(0,9)); 
$zero = $base[0]; 

//an integer number 
$r=rand(0, 999999); 
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n"; 
//an integer number 
$r++; 
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n"; 
//an integer number 
$r++; 
echo "$r converts to :".str_pad(intToAlphaBaseN($r,$base), 6, $zero, STR_PAD_LEFT)."\n"; 
?> 

working example

至於從字符串ID遞增,我建議選擇保存的整數值,增加與和轉換或寫一個類似的函數來轉換爲整數,增量,轉換回來。前者可能更容易。

至於強制相同的6個字符格式,唯一一次這應該是一個問題是當你通過根據你的格式的Z99999,是最大的。

+0

+1對於不重新發明輪子:) – Nicolas78 2012-02-06 22:36:57

+0

我已經考慮過了,但它必須總是正好6個字符,並逐漸適合提到的格式。此外,baseconvert從0開始,而不是A,所以如果我確實從「621937810」(AAAAAA)開始,那麼下一次跳轉將在AAAAAZ之後並且開始到AAAAB0。實際上,這是我的第一個考慮。 – 2012-02-06 22:43:21

+0

@OksanaMolotova然後你基本上是重新創建自己的基地。你將不得不做一些自定義增量。 base_convert評論頁面上有幾個選項允許您傳遞轉換字符的數組/字符串。這將允許您使用自己的自定義基礎進行轉換。例如:http://us.php.net/manual/en/function.base-convert.php#105990你可以改變數組在數字之前有字母......等等。至於正好是6個字符,請使用左側的鍵盤強制您的0字符(A)在左側。 – 2012-02-06 22:57:40

1

你基本上描述了一個36元符號(與二進制,十進制或十六進制相對)。即最後一個字母代表(int值)mod 36,第二個字母代表(值/ 36)%36。將整數轉換爲從0到35的六個數字的數組。然後映射結果值,使得0 = A,25 = Z,26 = 0等等。遞增只是通過以int值0開始,遞增並在每次遞增之後將其轉換爲這樣的字符串來實現的。也許你也可以建立一個36-ary算術,這樣你就不會浪費時間在我和i + 1之間,但是我寧願用這樣的暴力方法來開始。