嘿伙计们,我想将字符串从小写转换为大写,反之亦然,而不使用 php 中的任何内置函数 strtoupper 或 strtolower,谁能帮助我。
编辑:我可以使用其他一些函数来完成这项工作,例如 substr()、ord()、chr()、strlen()、str_replace。
这是我在这里的第一个问题,所以无法以最佳方式指定我需要什么。我的任务是在不使用数组的情况下完成这些提到的函数的工作。
...下次我会小心的。
c函数看起来像:
PHPAPI char *php_strtoupper(char *s, size_t len)
{
unsigned char *c, *e;
c = (unsigned char *)s;
e = (unsigned char *)c+len;
while (c < e) {
*c = toupper(*c);
c++;
}
return s;
}
PHPAPI char *php_strtolower(char *s, size_t len)
{
unsigned char *c, *e;
c = (unsigned char *)s;
e = c+len;
while (c < e) {
*c = tolower(*c);
c++;
}
return s;
}
而且这些函数也使用tolower
和toupper
来自ctype.h
C 库!看看这里的来源
function myStrToLower($string) {
$from = range('A','Z');
$to = range('a','z');
return str_replace($from, $to, $string);
}
function myStrToUpper($string) {
$from = range('a','z');
$to = range('A','Z');
return str_replace($from, $to, $string);
}
虽然我无法想象你为什么要这样做;您可以考虑制作一个将每个字母的小写字母与大写字母匹配的数组。然后对于字符串中的每个字符,在这个数组中找到它并返回值。(或者如果你要去另一个方向,那就是钥匙)。
虽然内置函数有开销,但我认为这种方法仍然会产生更多开销。
编辑:或者,您可以将每个字符转换为 ascii,然后检查范围以查看它是大写还是小写。然后加或减 32 (dec) 以更改为另一种情况。
一种可能的实现(如果您允许 str_split)是:
function myToLowerCase( $str )
{
static $charMap = array(
'A' => 'a', 'B' => 'b', 'C' => 'c', 'D' => 'd', 'E' => 'e', 'F' => 'f',
'G' => 'g', 'H' => 'h', 'I' => 'i', 'J' => 'j', 'K' => 'k', 'L' => 'l',
'M' => 'm', 'N' => 'n', 'O' => 'o', 'P' => 'p', 'Q' => 'q', 'R' => 'r',
'S' => 's', 'T' => 't', 'U' => 'u', 'V' => 'v', 'W' => 'w', 'X' => 'x',
'Y' => 'y', 'Z' => 'z',
);
$chars = str_split( $str );
$result = '';
for ( $i = 0; $i < count( $chars ); $i++ )
{
if ( isset( $charMap[$chars[$i]] ) )
{
$result .= $charMap[$chars[$i]];
}
else
{
$result .= $chars[$i];
}
}
return $result;
}
通过查看示例,大写等效项应该是显而易见的。