-3

嘿伙计们,我想将字符串从小写转换为大写,反之亦然,而不使用 php 中的任何内置函数 strtoupper 或 strtolower,谁能帮助我。

编辑:我可以使用其他一些函数来完成这项工作,例如 substr()、ord()、chr()、strlen()、str_replace。

这是我在这里的第一个问题,所以无法以最佳方式指定我需要什么。我的任务是在不使用数组的情况下完成这些提到的函数的工作。

...下次我会小心的。

4

4 回答 4

3

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

而且这些函数也使用tolowertoupper来自ctype.hC 库!看看这里的来源

于 2013-02-27T12:07:24.510 回答
2
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);
}
于 2013-02-27T11:55:18.700 回答
1

虽然我无法想象你为什么要这样做;您可以考虑制作一个将每个字母的小写字母与大写字母匹配的数组。然后对于字符串中的每个字符,在这个数组中找到它并返回值。(或者如果你要去另一个方向,那就是钥匙)。

虽然内置函数有开销,但我认为这种方法仍然会产生更多开销。

编辑:或者,您可以将每个字符转换为 ascii,然后检查范围以查看它是大写还是小写。然后加或减 32 (dec) 以更改为另一种情况。

于 2013-02-27T11:52:33.310 回答
0

一种可能的实现(如果您允许 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;
}

通过查看示例,大写等效项应该是显而易见的。

于 2013-02-27T12:06:58.097 回答