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

时间:2014-09-21 11:03:49

标签: php

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

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

但我如何从那里继续列出AA,AB,AC,AD,... AZ,BA,BB,BC等?

我做了一个快速的谷歌搜索,找不到任何东西,但我猜这种方法会有所不同。

我想我可以通过使用for循环和内部字母的数组来实现,但这种方式似乎有些粗鲁。

还有其他方式吗?

感谢。

5 个答案:

答案 0 :(得分:11)

PHP有一个字符串增量运算符,它完全符合:

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

结果:

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 AA AB AC AD AE AF... 

价:

  

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

http://php.net/manual/en/language.operators.increment.php

答案 1 :(得分:1)

尝试

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

答案 2 :(得分:0)

我制作了一个恒定时间函数,如下所示

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

public static $alpha = ['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'];

public static function getColName($index){
  $index--;
  $nAlphabets = 26;
  $f = floor($index/pow($nAlphabets,0)) % $nAlphabets;
  $s = (floor($index/pow($nAlphabets,1)) % $nAlphabets)-1;
  $t = (floor($index/pow($nAlphabets,2)) % $nAlphabets)-1;

  $f = $f < 0 ? '' : self::$alpha[$f];
  $s = $s < 0 ? '' : self::$alpha[$s];
  $t = $t < 0 ? '' : self::$alpha[$t];

  return trim("{$t}{$s}{$f}");

}

现在,如果您想使用它,请创建一个范围。您可以在循环中调用此函数,将值推送到数组。

至于大多数时候,我们需要表示而不是范围,这个函数可以正常工作。

如何使用

将这些静态函数包含在类中并将其用作

className::getColName(47);
  

在我的案例中制作一个范围是浪费记忆。

适合您的情况

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

答案 3 :(得分:0)

如@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;
}

答案 4 :(得分:-1)

我制作了一个自定义函数,它返回一个字母范围的连续字母,并且指定的字母数量通过(for example: if you set $pass=2, the function returns [A, C, E, ... AA, AC, AE])

另一个有用的选项可以$pairs=true将所有字​​母分组成(for example: if you set $pairs=true, the function returns a range of consecutive groups like [[A,B],[C,D],[E,F],...[AA,AB],[AC,AD]] for $pass=1 or [[A,C],[D,F],...[AA,AC],[AD,AF]] for $pass=2)对。

致电示例:

$myRange = $this->AlphaRange('A','AAZ'); // returns all combinations from A to AAZ

$myRange = $this->AlphaRange('A','AAZ',2); // returns consecutive combinations from A to AAZ with letters skiped from 2 to 2

$myRange = $this->AlphaRange('A','AAZ',5,true); // returns consecutive pairs of two letters that contains first and last letter of a group of 5 letters

希望有用。

    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;
    }