将整数转换为字母,反之亦然(例如,0 =“A”,26 =“AA”,27 =“AB”)

42

我有这个函数:

function toAlpha($data){
    $alphabet =   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');
    $alpha_flip = array_flip($alphabet);
    if($data <= 25){
      return $alphabet[$data];
    }
    elseif($data > 25){
      $dividend = ($data + 1);
      $alpha = '';
      $modulo;
      while ($dividend > 0){
        $modulo = ($dividend - 1) % 26;
        $alpha = $alphabet[$modulo] . $alpha;
        $dividend = floor((($dividend - $modulo) / 26));
      } 
      return $alpha;
    }
}

给定一个数字,将其转换为字符并且它运行得很好。

但是我还想要一个这样的反转函数:给定该函数的任何输出,返回确切的输入,以产生该输出。我尝试过以下代码:

function toNum($data){
$alphabet =   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');
    $alpha_flip = array_flip($alphabet);
  if(strlen($data) == 1){
          return (isset($alpha_flip[$data]) ? $alpha_flip[$data] : FALSE);
        }
        else if(strlen($data) > 1){
          $num = 1;
          for($i = 0; $i < strlen($data); $i++){
            if(($i + 1) < strlen($data)){
              $num *= (26 * ($alpha_flip[$data[$i]] + 1));
            }
            else{
              $num += ($alpha_flip[$data[$i]] + 1);
            }
          }
          return ($num + 25);
        }
}

但它没有正常工作...toAlpha(728)产生的是'aba',但toNum('aba')产生的是1378而不是728...

我做错了什么?如何修复反转函数使其正常工作?


所以你想把一个十进制数转换成二十六进制,是吗? - Mathieu Dumoulin
2
原始的toAlpha函数应该做什么?如果数字超过25,期望的行为是什么? - Alex Turpin
如果'a'是你的0,那么aa也应该是0吧?至少,如果你只是想使用字母而不是数字来实现纯粹的26进制。 - Hammerite
这两个函数期望得到的结果非常不清楚。你能解释一下这两个函数应该输出什么,以及根据什么规则来输出吗? - Decent Dabbler
在一般情况下,我认为最好的解决方案是使用chr()ord(),例如 $c = chr(ord('a') - 1 + $n); - 你甚至可以将ord('a') - 1(或ord('A')等)提取为常量。 - user719662
显示剩余2条评论
12个回答

0

我这样做是为了在使用 int 参数之前使用固定的字符长度 A = 0,Z = 25

function returnUIDfixChar(int $inc,int $charlength=3,int $min_input_length=3,string $prefix=''):string {
$alpha = range('A','Z');
$max_alpa_int = count($alpha)-1;
$over = 0;
$output_prefix = '';
$first_split = 0;
if(strlen($inc)>$min_input_length)
{
    $first_split = substr((string) $inc,0,strlen($inc)-$min_input_length);
}
$second_split = substr((string) $inc,0,$min_input_length);
for($i=0;$i<$charlength;$i++)
{
    $temp_over = (float) $first_split - $max_alpa_int;
    if($temp_over>0)
    {
        $output_prefix = $alpha[$max_alpa_int].$output_prefix;
        $first_split -= $max_alpa_int;
    }
    elseif($first_split<$max_alpa_int && $first_split>0)
    {
        $output_prefix = $alpha[$first_split].$output_prefix;
        $first_split -= $first_split;
    }
    else
    {
        $output_prefix = $alpha[0].$output_prefix;
    }
    $over = $first_split;
}
if(strlen($second_split)<$min_input_length)
{
    for($i=0;$i<$min_input_length-strlen($second_split);$i++)
    {
        $second_split = '0'.$second_split;
    }
}
return $output_prefix.($first_split>0?$first_split:'').$second_split;

}


-2
function toNum($str) {
  $num = 0;
  for ($i = 0; $i < strlen($str); $i++) {
    $num += ord($str[$i]);
    $num *= 26;
  }
  return $num;
}

function toStr($num) {
  $str = '';
  while ($num > 0) {
    $str = chr($num % 26) . $str;
    $num = (int) ($num / 26);
  }
  return $str;
} 

4
考虑添加一些评论。 - 888

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接