Id为用户友好的角色

时间:2012-09-17 07:59:32

标签: php

我想创建一个用户友好的系统,让用户输入一个特定的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);

2 个答案:

答案 0 :(得分:1)

将Excel列名称映射到数字顺序是一件很糟糕的事情,因为A-Z中没有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;

从字符转换为数字后,通过计算“计数”(0)中有多少27来删除隐藏的ceil($num/27);

在从一个数字转换为另一个字符之前,通过计算有多少26个被“计算”(0)来添加隐藏的ceil($col/26)

答案 1 :(得分:0)

这是一个基本转换问题,但有一点小技巧。

首先我们将'A'视为1,因此'AA''AAA'可能有意义,'B'2,{{1 } 'C' ..,但是3呢?不,'Z'不是26,这里的诀窍是将'Z'视为'Z',每次我们在转换时找到'A0'时,我们会将其写为0,并抛出'Z'(减去1)。

所以我们有以下代码:

'A'