<?php
/**
 * 当输入一个整数时,函数返回这个整数对应的excel列名
 * @example 
 * $num = 26 $name = Z,$num = 27 $name = AA,$num = 52 $name = ZZ, $num = 53 $name = AAA .......依次累推
 * @param int $num
 */
function showname($num) {
//定义一个数组
$arr = array(0 => '', 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E',
6 => 'F', 7 => 'G', 8 => 'H', 9 => 'I', 10 => 'J', 11 => 'K',
12 => 'L',  13 => 'M', 14 => 'N', 15 => 'O', 16 => 'P', 17 => 'Q',
18 => 'R', 19 => 'S', 20 => 'T', 21 => 'U', 22 => 'V', 23 => 'W',
24 => 'X', 25 => 'Y', 26 => 'Z'
);
$n = (int)($num/26); //取得整数倍
$m = $num%26; //取得余数
static $name;
if ($n <= 26) {
if ($m == 0) {
$name .= $arr[$n-1].'Z';
}else {
$name .= $arr[$n].$arr[$m];
}
}else {
//$name .= $arr[$n-26];
$name .= showname($n-1+$m);
}
return $name;
}
$num = 26*27;
echo showname($num);
?>
26倍以下的测试没有问题,以上的就出问题了,不清楚是哪的问题,谁能看看?

解决方案 »

  1.   

    $num = 26 $name = Z,$num = 27 $name = AA,$num = 52 $name = ZZ, $num = 53 $name = AAA .......依次累推这个就不对吧? 52=〉AZ, 53=〉BA 。   
      

  2.   

    更正一下,是$num = 52 $name = AZ, $num = 53 $name = BA,$num = 702 $name = ZZ,$num = 703 $name = AAA........
      

  3.   


    function showname($num) { 
    //定义一个数组 
    if($num==0) return '';
    $arr = array(0 => '', 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 
    6 => 'F', 7 => 'G', 8 => 'H', 9 => 'I', 10 => 'J', 11 => 'K', 
    12 => 'L',  13 => 'M', 14 => 'N', 15 => 'O', 16 => 'P', 17 => 'Q', 
    18 => 'R', 19 => 'S', 20 => 'T', 21 => 'U', 22 => 'V', 23 => 'W', 
    24 => 'X', 25 => 'Y', 26 => 'Z' 
    ); 
    $n = intval($num/26); //取得整数倍 
    $m = $num%26; //取得余数 
    return showname($n).$arr[$m];

      

  4.   

    function showname($num) { 
    //定义一个数组 
    if($num==0) return '';
    $arr = array(0 => 'Z', 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D', 5 => 'E', 
    6 => 'F', 7 => 'G', 8 => 'H', 9 => 'I', 10 => 'J', 11 => 'K', 
    12 => 'L',  13 => 'M', 14 => 'N', 15 => 'O', 16 => 'P', 17 => 'Q', 
    18 => 'R', 19 => 'S', 20 => 'T', 21 => 'U', 22 => 'V', 23 => 'W', 
    24 => 'X', 25 => 'Y' ,26=>'Z'
    ); 
    $n = intval(($num-1)/26); //取得整数倍 
    $m = $num%26; //取得余数  return showname($n).$arr[$m];
      

  5.   

    改了一下,应该过了
    $num = 26;
    echo showname($num)."\n"; //Z
    $num = 26+3;
    echo showname($num)."\n"; //AC$num = 26*26+2;
    echo showname($num)."\n"; //ZB$num = 26*27+1;
    echo showname($num)."\n";  //AAA$num = 26+26*26+26*26*26;
    echo showname($num)."\n";  //ZZZ$num = 26+26*26+26*26*26+1;
    echo showname($num)."\n";  //AAAA
      

  6.   

    可以弄短点
    function showname($num) { 
    if($num==0) return '';
    $arr ='ZABCDEFGHIJKLMNOPQRSTUVWXY'; 
    $n = intval(($num-1)/26); //取得整数倍 
    $m = $num%26; //取得余数 
    return showname($n).$arr{$m};
      

  7.   

    思路是1.求最后一位
    2.将最后一位去掉 (如ABC去掉最后一位就是AB)
    3.剩下的数继续进行1、2、3,直到num=0为止