programing

PHP의 숫자와 같은 문자를 증가시키는 방법은 무엇입니까?

yoursource 2022. 11. 22. 22:22
반응형

PHP의 숫자와 같은 문자를 증가시키는 방법은 무엇입니까?

3글자를 들여서 늘려서 새로 늘린 문자를 문자열로 돌려주는 함수를 쓰고 싶습니다.

한 글자를 다음 글자로 늘리는 방법은 알고 있지만, 두 번째 글자를 늘렸다가 멈추었다가 다시 첫 번째 글자를 늘려서 순차적으로 늘리는 방법을 어떻게 알 수 있을까요?

따라서 AAA가 통과되면 AAB를 반환합니다.AAZ를 통과하면 ABA(하드 부품)를 반환합니다.

로직과 어떤 php 함수가 도움이 되는지 알려주시면 감사하겠습니다.

더 좋은 것은, 이미 이 일을 한 사람이 있는가, 아니면 이 일을 할 수 있는 수업이 있는가?

도와주셔서 감사합니다.

문자/문자열 증분은 PHP에서 작동합니다(단, 감소하지 않음).

$x = 'AAZ';
$x++;
echo $x;  // 'ABA'

++ 연산자를 사용하여 수행할 수 있습니다.

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

아바

그러나 이 구현에는 몇 가지 이상한 점이 있습니다.

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

이렇게 하면 에서 온 편지가 출력됩니다.a로로 합니다.y.

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

그러면 다음에서 레트가 출력됩니다.a로로 합니다.z.aa은 로끝 and끝 and and and and로 끝난다.yz.

PHP RFC: Strict operators 디렉티브(현재 논의 ):

strict_operator가 네이블로 되어 있는 경우 문자열에서 증분 함수를 사용하면 TypeError가 느려집니다.

RFC가 병합되든 안 되든 PHP는 조만간 연산자 엄격성을 추가하는 방향으로 갈 것입니다.따라서 문자열을 증가시키지 마십시오.

a-z/A-Z 범위

문자가 a-z/A-Z 범위(z/Z를 넘지 않음)에 머무르는 것을 알고 있는 경우는, 문자를 ASCII 코드로 변환해, 증가시킨 후, 다시 문자로 변환하는 솔루션을 사용할 수 있습니다.

ord() a chr():

$letter = 'A';
$letterAscii = ord($letter);
$letterAscii++;
$letter = chr($letterAscii); // 'B'
  1. ord() 숫자 합니다.
  2. 이 숫자 표현은 증가됩니다.
  3. 를 사용합니다.chr()

댓글에 있는 것처럼 조심하세요.되므로 ASCII 테이블에서Z 90 (ASCII 90), (ASCII 90), (ASCII 90), (ASCII 90), (ASCII 90), (ASCII 90)에 가지 않습니다.AA ★님에게는[(ASCII 91)

Z/Z를 넘어서다

z became became가 되었다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;
    }
}

만약 당신이 더 많은 일을 할 생각이라면 100% 보상도 해드리겠습니다.하여 테스트합니다.++:

    /**
     * @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'];
    }

7비트 128자의 ASCII 범위에서 증가 또는 감소하는 가장 안전한 방법은 다음과 같습니다.

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

입니다.a, ASCII 사양 리스트로서

전체 ASCII 범위 인쇄:

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

ANSI7 비트 ASC에 대한 상세 정보II:man ascii


8 비트 확장 256 문자 UTF-8 범위의 증가 또는 감소.

호스트 머신의 charset에 대해서는 이 부분에서 차이가 생기기 시작하지만, 이러한 charset은 모두 최신 머신에서 사용할 수 있습니다.를 사용하는 것이 합니다.php-mbstring내선번호 : https://www.php.net/manual/en/function.mb-chr.php

확장 ASCII 문자 인코딩(EASCII 또는 하이 ASCII)은 표준 7비트 ASCII 문자 및 추가 문자를 포함하는 8비트 이상의 인코딩입니다.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 범위에서 증가 또는 감소하려면 다음 절차를 수행합니다.

다음은 html 엔티티를 생성하고 utf8로 변환하여 전체 유니코드 문자 집합을 생성하는 방법입니다.온라인으로 실행

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');
/* " */

문자의 10진수 표현을 사용하여 유니코드 기호를 검색합니다.

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

base16 16진수 표현을 사용한 동일한 기호:

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

첫 번째 32비트는 특수 제어 문자, 출력 가비지 " "으로 예약되어 있지만 의미가 있습니다.

숫자 표현 문제를 보고 있습니다.이것은 base24(또는 알파벳의 개수에 관계없이)입니다.베이스 b를 호출합니다.

알파벳(A=1, B=2, C=3)의 각 문자에 숫자를 할당합니다.

음음음입음입입입입 입입입는 "ABC"를 의미합니다.A*b^2 + B*b^1 + C*b^0int(int)의늘려주세요.

그런 다음 번호 시스템으로 다시 변환합니다.눗으로 b^2 숫자를를 by세 to to to to to to 모 to ( modulo ) 。b^1두 번째 자릿수의 경우 마지막 자릿수의 나머지(모듈로)를 'b^0^'로 나타냅니다.

이것은 도움이 될 수 있습니다.base10에서 다른 base로 변환하는 방법

ASCII 코드를 사용하여 알파 숫자를 계산할 수 있습니다.여기서부터 증가 및 감소하여 이전/다음 문자를 얻습니다.

문자열을 1글자로 분할하여 변환을 적용할 수 있습니다.

시작할 수 있게 몇 가지 생각만 하면 돼

 <?php 
$values[] = 'B';
$values[] = 'A';
$values[] = 'Z';
foreach($values as $value ){
  if($value == 'Z'){ 
       $value = '-1';
    }
$op = ++$value;
echo $op;
}
?>

c#에는 아마 php로 변환하여 필요에 맞게 수정할 수 있는 메서드가 있습니다.Hexavigesimal이 정확한 이름인지는 모르겠지만...

#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에서 사용할 수 있습니다.++대신, 좋아!

언급URL : https://stackoverflow.com/questions/3567180/how-to-increment-letters-like-numbers-in-php

반응형