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'
ord()
숫자 합니다.- 이 숫자 표현은 증가됩니다.
- 를 사용합니다.
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('!',ENT_NOQUOTES,'UTF-8');
/* ! */
echo html_entity_decode('"',ENT_NOQUOTES,'UTF-8');
/* " */
문자의 10진수 표현을 사용하여 유니코드 기호를 검색합니다.
echo html_entity_decode('€',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^0
int(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
'programing' 카테고리의 다른 글
정수 집합이 다른 정수 집합의 부분 집합인지 확인 (0) | 2022.11.22 |
---|---|
PHP에서 "Unable to allocate memory for pool"이 발생하는 원인은 무엇입니까? (0) | 2022.11.22 |
어레이 내의 아이템을 교환하는 방법 (0) | 2022.11.22 |
커스텀 커넥터를 사용하여 Django에서 MySQL/MariaDB 연결을 적절하게 끊는 방법 (0) | 2022.11.22 |
String Utils 입니다.EMPTY를 권장합니다. (0) | 2022.11.22 |