2013-02-27 2 views
-3

Привет, ребята, я хочу преобразовать строку из нижнего регистра в верхний и наоборот, без использования встроенных функций strtoupper или strtolower в php, может ли кто-нибудь мне помочь.php верхний и нижний регистр без встроенной функции

Редактировать: Я могу использовать некоторые другие функции для выполнения задания, такие как substr(), ord(), chr(), strlen(), str_replace.

Это был мой первый вопрос, поэтому я не мог указать, что мне нужно наилучшим образом. Мне было поручено выполнять работу в этих упомянутых функциях без использования массивов.

... в следующий раз я буду осторожен.

+9

Не могли бы вы объяснить, почему вы не хотите использовать встроенные функции? –

+0

Простая ASCII, специальная кодировка/кодировка или UTF-8? –

+0

Использовать PHP неявно означает использовать его функции! – jtheman

ответ

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); 
} 
+3

'range' и' str_replace' являются встроенными функциями ... Edit: OK, OP отредактировал свой вопрос – Passerby

1

пока я не могу представить, почему вы хотели бы это сделать; вы можете подумать о том, чтобы массив соответствовал строчной букве в верхнем регистре каждой буквы. Затем для каждого символа в строке найдите его в этом массиве и верните значение. (или ключ, если вы идете в другое направление).

Хотя встроенные функции имеют накладные расходы, я думаю, что этот метод повлечет за собой дополнительные накладные расходы.

EDIT: в качестве альтернативы вы можете преобразовать каждый символ в ascii, затем проверить диапазон, чтобы увидеть, находится ли он в верхнем или нижнем регистре. Затем добавьте или вычтите 32 (dec), чтобы перейти к другому случаю.

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

Прописная эквивалент должно быть очевидно, глядя на примере.

3

функции гр выглядеть следующим образом:

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! посмотреть на souce here