今天项目有个需求,拿Excel来说吧,对于一个表格,会在每一列的上方标出列号。基本规则如下,假设第一列从0开始,那么对于前26列(0-25),标号A-Z。对 于第27列,标号变成AA,然后是AB,AC,…, ZZ。然后再从AAA开始继续向后。那么请编一个程序来实现标号转换,也就是说输入一个整数,输出相应的标号。
/**
* 根据列数计算excel表格中的列名一
*
* $param number $intNum
* $return string
*/
function getLabelName1($intNum)
{
// 初始化
$strInit = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$strLen = strlen($strInit);
$intNum = max(0, intval($intNum)); // 接收十进制整数用于转化为26进制
$result = array(); // 用于存放转化的结果
$wordPos = 0;
while($intNum != 0 ) {
$tmpIntNum = $intNum;
if(($tmpIntNum % $strLen) != 0) { // 无法整除,取尾数
$result[$wordPos] = $strInit[$tmpIntNum % $strLen-1];
} else { // 可以整除,取整
if(intval($tmpIntNum / $strLen) <= $strLen+1) {
if($wordPos == 0) {
$result[$wordPos] = $strInit[$strLen-1];
$result[++$wordPos] = $strInit[intval($tmpIntNum / $strLen) - 2];
} else {
$result[$wordPos] = $strInit[$tmpIntNum -1];
}
$intNum = 0;
} else {
$result[$wordPos] = $strInit[$strLen-1];
$intNum = $intNum - $strLen;
}
}
$intNum = intval($intNum / $strLen);
$wordPos++;
}
sort($result);
$val = '';
foreach ($result as $v) {
$val .= $v;
}
return $val;
}
echo getLabelName1(36);
/**
* 根据列数计算excel表格中的列名二
*
* $param number $intNum
* $return string
*/
private function getLabelName2($intNum)
{
$num = intval($intNum);
if ($num <= 0) {
return false;
}
$letterArr = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
$letter = '';
do {
$key = ($num - 1) % 26;
$letter = $letterArr[$key] . $letter;
$num = floor(($num - $key) / 26);
} while ($num > 0);
return $letter;
}
echo getLabelName2(36);