如何在PHP中增加数字等字母?

Abs*_*Abs 59 php

我想写一个函数,它接受3个字符并递增它并返回新增加的字符作为字符串.

我知道如何增加一个字母到下一个字母,但我怎么知道何时增加第二个字母然后停止然后再增加第一个字母以连续增加?

因此,如果AAA通过,则返回AAB.如果AAZ通过则返回ABA(困难部分).

我很感激帮助逻辑和PHP功能将有用.

更好的是,有些已经完成了这个或者有一个类可以做到这一点?

谢谢大家的帮助

Mar*_*ker 126

字符/字符串增量在PHP中有效(尽管减量没有)

$x = 'AAZ';
$x++;
echo $x;
Run Code Online (Sandbox Code Playgroud)

  • 或者只是`echo ++ $ x;`:) (3认同)

tam*_*asd 21

你可以用++运算符来完成它.

$i = 'aaz';
$i++;
print $i;
Run Code Online (Sandbox Code Playgroud)

ABA

但是这个实现有一些奇怪的东西:

for($i = 'a'; $i < 'z'; $i++) print "$i ";
Run Code Online (Sandbox Code Playgroud)

这将打印出的字母ay.

for($i = 'a'; $i <= 'z'; $i++) print "$i ";
Run Code Online (Sandbox Code Playgroud)

这将打印出lettes az,并将它与继续aa和结尾yz.

  • 这并不奇怪,它只是不直观.如果`$ i =='z'`条件仍然为真,那么`for`循环将继续,将`$ i`设置为''aa'`.只有当`$ i`达到''za'时,条件才会变为假. (6认同)

sim*_*Pod 7

PHP RFC中所建议:严格运算符指令 目前正在讨论中):

启用strict_operators时,在字符串上使用递增功能将引发TypeError。

无论RFC是否合并,PHP迟早都会朝着增加操作员严格性的方向发展。因此,您不应该增加string

AZ / AZ范围

如果您知道字母将保持在z / AZ范围内(不超过z / Z),则可以使用将字母转换为ASCII代码,对其进行递增并转换回字母的解决方案。

使用ord()一个chr()

$letter = 'A';
$letterAscii = ord($letter);
$letterAscii++;
$letter = chr($letterAscii); // 'B'
Run Code Online (Sandbox Code Playgroud)
  1. ord() 将字母转换为ASCII num表示形式
  2. num表示递增
  3. 使用chr()数字将转换回字母

正如评论中发现的那样,要小心。这种迭代ASCII表,以便从Z(ASCII 90),它并没有去AA,而是[(ASCII 91)。

超越z / Z

如果您敢于走下去并且想要z成为aa,这就是我想出的:

final class NextLetter
{
    private const ASCII_UPPER_CASE_BOUNDARIES = [65, 91];
    private const ASCII_LOWER_CASE_BOUNDARIES = [97, 123];

    public static function get(string $previous) : string
    {
        $letters = str_split($previous);
        $output = '';
        $increase = true;

        while (! empty($letters)) {
            $letter = array_pop($letters);

            if ($increase) {
                $letterAscii = ord($letter);
                $letterAscii++;
                if ($letterAscii === self::ASCII_UPPER_CASE_BOUNDARIES[1]) {
                    $letterAscii = self::ASCII_UPPER_CASE_BOUNDARIES[0];
                    $increase = true;
                } elseif ($letterAscii === self::ASCII_LOWER_CASE_BOUNDARIES[1]) {
                    $letterAscii = self::ASCII_LOWER_CASE_BOUNDARIES[0];
                    $increase = true;
                } else {
                    $increase = false;
                }

                $letter = chr($letterAscii);
                if ($increase && empty($letters)) {
                    $letter .= $letter;
                }
            }

            $output = $letter . $output;
        }

        return $output;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您打算进一步使用它,我也会给您100%的覆盖率。它针对原始字符串增量进行测试++

    /**
     * @dataProvider letterProvider
     */
    public function testIncrementLetter(string $givenLetter) : void
    {
        $expectedValue = $givenLetter;

        self::assertSame(++$expectedValue, NextLetter::get($givenLetter));
    }

    /** 
     * @return iterable<string>
     */
    public function letterProvider() : iterable
    {
        yield ['A'];
        yield ['a'];
        yield ['z'];
        yield ['Z'];
        yield ['aaz'];
        yield ['aaZ'];
        yield ['abz'];
        yield ['abZ'];
    }
Run Code Online (Sandbox Code Playgroud)