2012-09-17 67 views
0

我想創建一個用戶友好的系統,使用戶輸入某個ID:編號以用戶友好的字符

id 1-26: A-Z 
27: AA 
28: AB 
    ... 
    ... 
    ZZZ 

我嘗試了幾種方法來實現這一點,但我得到的隨機字符...

$counter = 7; 
do { 
    $temp = floor($id/(26^$counter)) % 26; 
    $counter--; 
    echo($temp.' '); 
} while($counter > 0); 
+0

感謝編輯! (Typo in title) – Ferdau

+0

'$ id'從哪裏來?這是用戶輸入的號碼嗎? – aefxx

+0

如果我理解正確,那麼ID 27應該是AA? – TheHe

回答

1

將Excel列名映射到數字順序是種糟糕的事情,因爲AZ中沒有0 ...

無論如何,我確實想出了兩個函數來將它們來回轉換:

function calcCol($col) //character to number 
{ 
    if(is_numeric($col)) return intval($col); 
    $col=array_reverse(str_split(strtoupper(preg_replace("/[^a-z]/i","",$col)))); 
    $num=0; 
    foreach($col as $i=>$ch) 
    { 
     $num+=(ord($ch)-ord('A')+1)*pow(27,$i); 
    } 
    $num-=ceil($num/27)-1; 
    return $num; 
} 
function getCol($col) //number to character 
{ 
    if(preg_match("/^[a-z]+$/i",$col)) return strtoupper($col); 
    $col=abs(intval($col)); 
    $col+=ceil($col/26)-1; 
    $str=""; 
    while($col>0) 
    { 
     $tmp=$col%27; 
     $str=chr($tmp-1+ord('A')).$str; 
     $col=floor($col/27); 
    } 
    return $str; 
} 

說明:

考慮A-Z爲具有基於27數字系統丟失/隱藏0;

並將字符轉換爲數字後,通過計算有多少27個「被計數」來刪除那些隱藏的0ceil($num/27));

在將數字轉換爲字符之前,通過計算有多少26個「被計數」(ceil($col/26)),將這些隱藏的0加回去。

+0

非常感謝!很好的答案! – Ferdau

0

這是一個基地轉換問題,但有一個小技巧。

首先,我們認爲'A'1,所以'AA''AAA'可能是有意義的,並且'B'2'C'3 ..,而是'Z'什麼?不,'Z'不是26,這裏的技巧是考慮'Z''A0',每當我們在轉換時找到0時,我們將其寫爲'Z',並將'A'丟掉(通過減1)。

,所以我們有下面的代碼:

function num2user($num) 
{ 
    $s = "ZABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    $ret = ""; 
    while($num > 0) 
    { 
     $m = $num % 26; 
     $ret = $s[$m].$ret; 
     $num = floor($num/26); 
     if($m == 0) $num = $num - 1; 
    } 
    return $ret; 
} 

for($i = 1 ; $i < 128 ; $i++) 
{ 
    echo "$i=".num2user($i)."\n"; 
}