代码之家  ›  专栏  ›  技术社区  ›  Abs

如何在PHP中增加像数字这样的字母?

php
  •  53
  • Abs  · 技术社区  · 16 年前

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

    所以如果AAA通过了,就返回AAB。如果

    我将感谢帮助的逻辑和什么php函数将是有用的使用。

    更好的是,有些人已经做过了,或者有课程可以做吗??

    谢谢大家的帮助

    7 回复  |  直到 8 年前
        1
  •  144
  •   Mark Baker    16 年前

    字符/字符串增量在PHP中起作用(尽管减量不起作用)

    $x = 'AAZ';
    $x++;
    echo $x;
    
        2
  •  23
  •   tamasd    16 年前

    你可以用++操作符来实现。

    $i = 'aaz';
    $i++;
    print $i;
    

    然而,这种实现有一些奇怪的地方:

    for($i = 'a'; $i < 'z'; $i++) print "$i ";
    

    a y .

    for($i = 'a'; $i <= 'z'; $i++) print "$i ";
    

    这将打印来自 z 它继续着 aa 结束于 yz .

        3
  •  15
  •   simPod    6 年前

    如中所述 PHP RFC: Strict operators directive ):

    当启用严格的\u运算符时,对字符串使用increment函数将抛出TypeError。

    不管RFC是否被合并,PHP迟早会朝着增加操作符严格性的方向发展。因此, .

    a-z/a-z范围

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

    使用 ord() chr()

    $letter = 'A';
    $letterAscii = ord($letter);
    $letterAscii++;
    $letter = chr($letterAscii); // 'B'
    
    1. 作战需求文件()
    2. num表示是递增的
    3. 使用 数字转换回字母

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

    ++ :

        /**
         * @dataProvider letterProvider
         */
        public function testIncrementLetter(string $givenLetter) : void
        {
            $expectedValue = $givenLetter;
    
            self::assertSame(++$expectedValue, NextLetter::get($givenLetter));
        }
    
        /** 
         * @return iterable<array<string>>
         */
        public function letterProvider() : iterable
        {
            yield ['A'];
            yield ['a'];
            yield ['z'];
            yield ['Z'];
            yield ['aaz'];
            yield ['aaZ'];
            yield ['abz'];
            yield ['abZ'];
        }
    
        4
  •  2
  •   NVRM    6 年前

    增加或减少 ,最安全:

    $CHAR = "l";
    echo chr(ord($CHAR)+1)." ".chr(ord($CHAR)-1);
    /* m k */
    

    a ,作为 ascii spec list

    打印整个 ascii码 范围:

    for ($i = 0;$i < 127;$i++){
        echo chr($i);
    }
    /* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ */
    

    更多关于 ANSI 7 bits ASCII : man ascii


    增加或减少 8位扩展256字符UTF-8范围

    这就是主机字符集的不同之处。但这些字符集都可以在现代机器上使用。从php来看,最安全的方法是使用 php-mbstring 分机: https://www.php.net/manual/en/function.mb-chr.php

    扩展ASCII(EASCII或high ASCII)字符编码 ASCII字符,加上其他字符。 https://en.wikipedia.org/wiki/Extended_ASCII

    更多信息,例如: man iso_8859-9

       ISO 8859-1    West European languages (Latin-1)
       ISO 8859-2    Central and East European languages (Latin-2)
       ISO 8859-3    Southeast European and miscellaneous languages (Latin-3)
       ISO 8859-4    Scandinavian/Baltic languages (Latin-4)
       ISO 8859-5    Latin/Cyrillic
       ISO 8859-6    Latin/Arabic
       ISO 8859-7    Latin/Greek
       ISO 8859-8    Latin/Hebrew
       ISO 8859-9    Latin-1 modification for Turkish (Latin-5)
       ISO 8859-10   Lappish/Nordic/Eskimo languages (Latin-6)
       ISO 8859-11   Latin/Thai
       ISO 8859-13   Baltic Rim languages (Latin-7)
       ISO 8859-14   Celtic (Latin-8)
       ISO 8859-15   West European languages (Latin-9)
       ISO 8859-16   Romanian (Latin-10)
    

    例如,我们可以找到 € ISO 8859-7中的符号:

    244   164   A4     €     EURO SIGN
    

    在16位UTF-16 Unicode范围内 :

    Run it online

    for ($x = 0; $x < 262144; $x++){
      echo html_entity_decode("&#".$x.";",ENT_NOQUOTES,"UTF-8");
    }
    

    同样的东西,但范围扩大到 (16^4 * 4)

    echo html_entity_decode('&#33;',ENT_NOQUOTES,'UTF-8');
    /* ! */
    echo html_entity_decode('&#34;',ENT_NOQUOTES,'UTF-8');
    /* " */
    

    the unicode € symbol ,使用 字符的十进制表示法。

    echo html_entity_decode('&#8364;',ENT_NOQUOTES,'UTF-8');
    /* € */
    

    相同的符号,使用 比较基准16 十六进制表示法:

    echo html_entity_decode('&#'.hexdec("20AC").';',ENT_NOQUOTES,'UTF-8');
    /* € */
    

    special control characters

        5
  •  1
  •   Daren Thomas    16 年前

    您正在研究一个数字表示问题。这是base24(或者不管你的字母表有多少个数字)。我们称之为基地b。

    给字母表中的每个字母分配一个数字(a=1,B=2,C=3)。

    接下来,算出您输入的“数字”:表示“ABC”的意思是 A*b^2 + B*b^1 + C*b^0

    b^2 为了得到第三个数字,余数(模)由 b^1 对于第二位,余数(模)乘以“b^0^表示最后一位。

    How to convert from base10 to any other base

        6
  •  0
  •   CaffGeek    16 年前

    我在c语言中有这些方法,您可以将它们转换为php并进行修改以满足您的需要,但我不确定hexavigesmal是否是这些方法的确切名称。。。

    #region Hexavigesimal (Excel Column Name to Number)
    public static int FromHexavigesimal(this string s)
    {
        int i = 0;
        s = s.Reverse();
        for (int p = s.Length - 1; p >= 0; p--)
        {
            char c = s[p];
            i += c.toInt() * (int)Math.Pow(26, p);
        }
    
        return i;
    }
    
    public static string ToHexavigesimal(this int i)
    {
        StringBuilder s = new StringBuilder();
    
        while (i > 26)
        {
            int r = i % 26;
            if (r == 0)
            {
                i -= 26;
                s.Insert(0, 'Z');
            }
            else
            {
                s.Insert(0, r.toChar());
            }
    
            i = i / 26;
        }
    
        return s.Insert(0, i.toChar()).ToString();
    }
    
    public static string Increment(this string s, int offset)
    {
        return (s.FromHexavigesimal() + offset).ToHexavigesimal();
    }
    
    private static char toChar(this int i)
    {
        return (char)(i + 64);
    }
    
    private static int toInt(this char c)
    {
        return (int)c - 64;
    }
    #endregion
    

    编辑

    我从PHP中可以使用的其他答案中看到了 ++ 相反,很好!

        7
  •  0
  •   Andreas    16 年前

    你可以用ASCII码来表示字母数字。从那里你可以递增和递减以得到上一个/下一个字符。

    可以将字符串拆分为单个字符,然后对这些字符应用转换。

    只是一些想法让你开始。

        8
  •  0
  •   Vimal Kumar E    10 年前
     <?php 
    $values[] = 'B';
    $values[] = 'A';
    $values[] = 'Z';
    foreach($values as $value ){
      if($value == 'Z'){ 
           $value = '-1';
        }
    $op = ++$value;
    echo $op;
    }
    ?>
    
    推荐文章