我想写一个函数,它接受3个字符并递增它,并将新增加的字符作为字符串返回。
我知道如何增加一个字母到下一个字母,但我怎么知道何时增加第二个字母然后停止然后再增加第一个字母以便连续增加?
因此,如果AAA通过,则返回AAB。如果 AAZ通过返回ABA(困难部分)。
我很感激有关逻辑的帮助以及使用哪些php函数。
更好的是,有些人已经完成了这项工作,或者有一个班级可以做到这一点吗?
感谢大家的帮助
答案 0 :(得分:119)
字符/字符串增量在PHP中有效(尽管递减没有)
$x = 'AAZ';
$x++;
echo $x;
答案 1 :(得分:20)
您可以使用++运算符。
$i = 'aaz';
$i++;
print $i;
ABA
然而,这个实现有一些奇怪的东西:
for($i = 'a'; $i < 'z'; $i++) print "$i ";
这会打印出a
到y
的字母。
for($i = 'a'; $i <= 'z'; $i++) print "$i ";
这会打印出a
到z
的字母,然后是aa
,最后是yz
。
答案 2 :(得分:3)
正确的方法不是使用++
,而是使用ord()
和chr()
$letter = 'A';
$letterAscii = ord($letter);
$letterAscii++;
$letter = chr($letterAscii); // 'B'
您不应该递增字符串,因此
ord()
将字母转换为ASCII数字表示形式chr()
转换回字母答案 3 :(得分:1)
您正在查看数字表示问题。这是base24(或者你的字母表有多少个数字)。让我们打电话给基地b。
为字母表中的每个字母指定一个数字(A = 1,B = 2,C = 3)。
接下来,找出您输入的“数字”:表示“ABC”表示A*b^2 + B*b^1 + C*b^0
使用此公式查找数字(int)。增加它。
接下来,将其转换回您的数字系统:除以b^2
得到第三个数字,余数(模数)除以b^1
得到第二个数字,余数(模数)除以`b ^ 0 ^为最后一位数。
答案 4 :(得分:1)
要在7位128字符ASCII范围内递增或递减,最安全:
$CHAR = "l";
echo chr(ord($CHAR)+1)." ".chr(ord($CHAR)-1);
/* m k */
因此,通过将a
递减为ansi spec list来反击是很正常的:
for ($i = 0;$i < 127;$i++){
echo chr($i);
}
/* !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ */
有关ANSI 7位的更多信息:man ascii
要在 8位扩展的256个字符的UTF-8范围内递增或递减。
这是关于主机字符集的不同之处。但是这些字符集都可以在现代机器上使用。在php中,最安全的方法是使用php-mbstring
扩展名:https://www.php.net/manual/en/function.mb-chr.php
扩展的ASCII(EASCII或高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范围内递增或递减 :
这里是一种通过生成html实体并将其转换为utf8来生成整个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('!',ENT_NOQUOTES,'UTF-8');
/* ! */
echo html_entity_decode('"',ENT_NOQUOTES,'UTF-8');
/* " */
前32位保留给special control characters,输出垃圾������,但有含义。
答案 5 :(得分:0)
我在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中你可以使用++
代替,很好!
答案 6 :(得分:0)
您可以将ASCII代码用于alpha数字。从那里你增加和减少以获得上一个/下一个字符。
您可以将字符串拆分为单个字符,然后对这些字符应用转换。
让你开始的一些想法。
答案 7 :(得分:0)
<?php
$values[] = 'B';
$values[] = 'A';
$values[] = 'Z';
foreach($values as $value ){
if($value == 'Z'){
$value = '-1';
}
$op = ++$value;
echo $op;
}
?>