如何在PHP中从A到Z列出,然后再到AA、AB、AC等

如何在PHP中从A到Z列出,然后再到AA、AB、AC等,php,Php,我知道如何从A到Z列出: foreach (range('A', 'Z') as $char) { echo $char . "\n"; } 但我如何从那里继续列出AA,AB,AC,AD。。。AZ、BA、BB、BC等等 我在谷歌上快速搜索了一下,什么也找不到,不过我想方法会有所不同 我想我可以通过使用for循环和一个包含字母的数组来实现,尽管这种方式看起来有点粗俗 还有别的办法吗 谢谢。试试看 foreach (range('A', 'Z') as $char) { foreach

我知道如何从A到Z列出:

foreach (range('A', 'Z') as $char) {
  echo $char . "\n";
}
但我如何从那里继续列出AA,AB,AC,AD。。。AZ、BA、BB、BC等等

我在谷歌上快速搜索了一下,什么也找不到,不过我想方法会有所不同

我想我可以通过使用for循环和一个包含字母的数组来实现,尽管这种方式看起来有点粗俗

还有别的办法吗

谢谢。

试试看

foreach (range('A', 'Z') as $char) {
    foreach (range('A', 'Z') as $char1) {
        echo $char . $char1. "\n";
    }
}

PHP有一个字符串增量运算符,它正好执行以下操作:

for($x = 'A'; $x < 'ZZ'; $x++)
    echo $x, ' ';
参考:

PHP在处理字符变量的算术运算时遵循Perl的约定,而不是C。例如,在PHP和Perl中$a='Z'$a++;将$a转换为'AA',而在C中a='Z';a++;将a转换为“[”(ASCII值“Z”为90,ASCII值“[”为91)。请注意,字符变量可以递增,但不能递减,即使如此,也只支持普通ASCII字母和数字(a-Z、a-Z和0-9)。递增/递减其他字符变量无效,原始字符串不变


PHP在处理字符变量的算术运算时遵循Perl的惯例。

因此可以在php中增加字母表

$limit = "AZ";

for($x = "A", $limit++; $x != $limit; $x++) {

    echo "$x ";

}
我会给你结果的

A
B
C
.
.
.
AX
AY
AZ

希望这会有所帮助。

我制作了一个自定义函数,返回字母顺序范围内的连续字母,并通过指定数量的字母传递
(例如:如果设置$pass=2,函数将返回[a,C,E,…AA,AC,AE])

另一个有用的选项是将所有字母分组为成对的
$pairs=true
(例如:如果设置$pairs=true,函数将返回一系列连续的组,如$pass=1的[[a,B]、[C,D]、[E,F]、…[AA,AB]、[AC,AD]]或$pass=2的[[a,C]、[D,F]、[AA,AF]]。

举个例子:

$myRange=$this->AlphaRange('A','AAZ');//返回从A到AAZ的所有组合

$myRange=$this->AlphaRange('A','AAZ',2);//返回从A到AAZ的连续组合,字母从2跳过到2

$myRange=$this->AlphaRange('A','AAZ',5,true);//返回两个连续的字母对,其中包含一组5个字母中的第一个和最后一个字母

希望对大家有用

    public function AlphaRange($from, $to, $pass=1, $pairs=false) {
        $range = [];
        $currStep = 1;
        $nextStep = $pass+1;
        $currPair = 0;

        for($i=$from; $i<'ZZZ'; $i++) {

            if ($currStep == 1) {
                if (false !== $pairs) {
                    $range[$currPair][] = $i;
                }
                else {
                    $range[] = $i;
                }
            }
            else {
                if ($currStep == $nextStep) {

                    if (false !== $pairs) {

                        // $range[count($range[$currPair]) == 2 ? ++$currPair : $currPair][] = $i;

                        $range[$currPair][] = $lastI; 
                        $range[++$currPair][] = $i;

                    }
                    else {
                        $range[]  = $i;
                    }

                    $currStep = 1;
                    $nextStep = $pass+1;
                }
                else {
                    $lastI = $i;
                }                           
            }

            if ($i == $to) {
                if (false !== $pairs) {
                    if (count($range[$currPair]) == 1) {
                        $range[$currPair][] = $i;
                    }
                }
                break;
            }

            $currStep++;
        }

        return $range;
    }
公共函数AlphaRange($from,$to,$pass=1,$pairs=false){
$range=[];
$currStep=1;
$nextStep=$pass+1;
$currPair=0;

对于($i=$from;$i我制作了一个常数时间函数,如下所示

此函数提供数字索引的字母表示形式

在我的情况下制作一个范围是浪费内存。

针对您的案例

for($i = 1; $i < 1000; $i++) $range[] = className::getColName($i);
for($i=1;$i<1000;$i++)$range[]=className::getColName($i);

如@Abhijit Srivastava所示,但这是一种通用方法

function alphaIndex($index) {
    $column = "";
    $nAlphabets = 26;
    $times = (int)($index/$nAlphabets);
    $times = $index%$nAlphabets > 0 ? ($times+1):($times);
    $index--;

    for ($i=0; $i < $times; $i++) { 
        $less = $i > 0 ? 1:0;
        $key = (floor($index/pow($nAlphabets,$i)) % $nAlphabets)-$less;

        $column = ( $key<0 ? '':chr(65+$key) ).$column;
    }

    return $column;
}
函数alphaIndex($index){
$column=“”;
$nAlphabets=26;
$times=(int)($index/$nAlphabets);
$times=$index%$nAlphabets>0?($times+1):($times);
$index--;
对于($i=0;$i<$times;$i++){
$less=$i>0?1:0;
$key=(下限($index/pow($nAlphabets,$i))%$nAlphabets)-$less;

$column=($KEYOUR代码示例作为雏形使用递归函数如何?我想你错过了最后一部分,等等。嗯,sorta可以工作-但是这如何首先给我a,B,C…Z?不得不说,对于上述情况,它可以工作,但是当你尝试使用($x='a';$x<'AZ';$x++)的
例如,它会坏。@think123:只需替换
不确定为什么设置
@KingKing
我没有尝试任何代码,我知道它是如何工作的,我已经多次回答了这个问题,并且几乎每天都在实代码中使用这种类型的字符递增方式……我告诉你不要在字母比较中使用
=
像这样,但总是使用
!==
className::getColName(47);
for($i = 1; $i < 1000; $i++) $range[] = className::getColName($i);
function alphaIndex($index) {
    $column = "";
    $nAlphabets = 26;
    $times = (int)($index/$nAlphabets);
    $times = $index%$nAlphabets > 0 ? ($times+1):($times);
    $index--;

    for ($i=0; $i < $times; $i++) { 
        $less = $i > 0 ? 1:0;
        $key = (floor($index/pow($nAlphabets,$i)) % $nAlphabets)-$less;

        $column = ( $key<0 ? '':chr(65+$key) ).$column;
    }

    return $column;
}