我知道如何从A到Z列出:
foreach (range('A', 'Z') as $char) {
echo $char . "\n";
}
但我如何从那里继续列出AA,AB,AC,AD,... AZ,BA,BB,BC等?
我做了一个快速的谷歌搜索,找不到任何东西,但我猜这种方法会有所不同。
我想我可以通过使用for循环和内部字母的数组来实现,但这种方式似乎有些粗鲁。
还有其他方式吗?
感谢。
答案 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)。递增/递减其他字符变量无效,原始字符串不变。
答案 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;
}