PHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等

Posted

技术标签:

【中文标题】PHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等【英文标题】:PHP: How to output list like this: AA, AB, AC, all the way to ZZZY, ZZZZ, ZZZZA etc 【发布时间】:2011-07-30 02:08:10 【问题描述】:

我正在尝试编写一个将整数转换为这样的字符串的函数,但我无法弄清楚逻辑... :(

1 = a
5 = e
27 = aa
28 = ab
etc...

有人可以帮忙吗?我真的很生气,我无法思考如何写这个...... :(

【问题讨论】:

【参考方案1】:

一长串here:

/*
 * Convert an integer to a string of uppercase letters (A-Z, AA-ZZ, AAA-ZZZ, etc.)
 */
function num2alpha($n)

    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n%26 + 0x41) . $r;
    return $r;


/*
 * Convert a string of uppercase letters to an integer.
 */
function alpha2num($a)

    $l = strlen($a);
    $n = 0;
    for($i = 0; $i < $l; $i++)
        $n = $n*26 + ord($a[$i]) - 0x40;
    return $n-1;

【讨论】:

+1。虽然您需要在 num2alpha 中从 $n 的初始值中减去 1,而不是在 alpha2num 中最后减去 1,以匹配 1 = A 的 OP 规范。 好调用 -- 代码直接取自 php.net 站点,作为该概念的良好参考 为什么它不适用于像这样的大量数字:num2alpha(20160504123435)?【参考方案2】:

我将添加这个答案来总结 cmets 关于滥用 base-26 的问题。

当遇到这个问题时,一个常见的第一反应是想“有 26 个字母,所以这必须是 base-26!我需要做的就是将每个字母映射到它对应的数字” .

但这不是base-26。很容易看出原因:没有零!

在 base-26 中,数字二十六是第一个有两位数的数字,写成“10”。在这个计数系统中,二十六有一个数字“Z”,第一个两位数是二十七。

但是如果我们让 A=0, ..., Z=25 呢?这样我们就有了一个零,第一个两位数变成了二十六。到目前为止,一切都很好。我们现在怎么写二十六?那是“AA”。但是……不是A=0吗?哎呀! A = AA = AAA = "0" = "00" = "000"。

【讨论】:

只是想把我的头包起来。如果 A=0,26 不只是 BA,而不是 AA。 @Paystey 是的,如果 这是 base-26。但是这个方案中25(Z)后面的数字是AA。 是的,没错,我只是想让我的头脑完全了解 base 26。有用。但事实并非如此。谢谢。【参考方案3】:

您必须使用 base_convert 将您的数字转换为 26 进制:

base_convert(35, 10, 26);

这为您提供了 1 - p 中的各个分量,因此 35 变为 19 (1 * 26 + 9)。然后您必须将各个组件映射到所需的集合,因此 1 => a、9 => i、a => j 等,19 变为 ai

【讨论】:

问题是,26 => 1 * 26 + 0 => 10 以 26 为底。哎呀,你如何映射 0?不,这种类似于 Excel 的计数不是以 26 为基数 @Martinho Fernandes 很有趣,你是对的,根本没有根据。我想知道 OP 如何占 0...【参考方案4】:

嗯,你几乎可以从 10 进制转换为 26 进制。10 进制有数字 0-9,而 26 进制可以用“数字”A-Z 来表示。从 base-10 转换很容易 - 参见例如这个:http://www.mathsisfun.com/base-conversion-method.html 罢工> 编辑:实际上,base-26 无法解释多种等效的写入 0 的方式(0 = 00 = 000)。

【讨论】:

不,不是。比如说,“数字”A 等价于“数字”1,B 是 2,以此类推。所以我们有 1,2,3,4,...,Z,11,12,13,...,1Z,21。不好。好的,让我们试试 A = 0, B = 1 等。我们有 0,1,2,3,4,...,Z,00,01,02,...,0Z,10,。不,根本不是 base-26。 @Martinho Fernandes:我确实不是说base-36,也不是0-9+A-Z;你似乎正在使用它。请告诉我,英文字母表中有多少个字母,从 A 到 Z?上次我检查时,有 26 个。 A = 1,B = 2, C = 3, ..., X = 24, Y = 25, Z = 26, AA = 27 ( 26^1 *A + 26^0 *A ), AB = 28 ( 26 ^1 * A + 26^0 * A ), AC = 29, AD = 30 等等。你可能对使用 0-9+AF 的 base-16 感到困惑,这是一个稍微不同的情况。跨度> 你错过了我的意思:1,2,3,4,...,,11,12,13。您只是错过了数字“10”(又名 26)!请看,以 26 为底,数字 26 有 两位数,就像以 2 为底的 2 和以 10 为底的 10。 @Martinho Fernandes:看来我确实错过了。如果A = 0,那么A = AA = AAA = AAAA = AAAAAA = 0。你说得对,谢谢你的指正。【参考方案5】:
void convert(int number)


        string str = "";

    while(number)
    
        char ch;
        ch = (number - 1) % 26 + 65;    
        str = ch + str;
        number = (number-1) / 26;
    

    cout << str << endl;

【讨论】:

以上是关于PHP:如何输出这样的列表:AA、AB、AC,一直到 ZZZY、ZZZZ、ZZZZA 等的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 5.7 中更新列枚举行号

PHP - 在 mysqli 查询中使用数组

python如何将列表中的元素添加进字典

java序列化与反序列化

递归序列python

在python中列出与彼此元素映射