Здравствуйте! Вчера у меня произошла непонятная ситуация - вдруг ни с того ни с сего перестала корректно работать самописная функция. Причём перестала работать достаточно интересно - если функцию вызываешь сразу же при открытии страницы - она раобтает корректно. Но стоит открыть страницу с формой, при обработке уже которой будет выполняться та же функция, так вот эта функция начинает странно себя вести. Функция представляет из себя простой набор операций по преобразованию символов, и в случае когда она вызывается при обработке формы почему-то в качестве результата выходит нужная строка, но почему-то обрезанная на 1 символ в конце! Т.е. на один символ короче, последний, как бы просто обрезается. В чём дело - понять не могу. Или же свести это просто на банальную какую-то ошибку интерпретатора? Хотя веб-сервер и php на нём настроены с конца 2008 года и до сих пор тьфу тьфу сбоев никогда не давали. т.е. если просто после вызова функции, к примеру, результатом выходит строка "выдпоув", то после такого же вызова этой же самой функции выходит строка "выдпоу". В чём загвоздка? IIS 6.0 PHP 5.2.1 Привожу мой код: Код (Text): <?php function perevod($word) { $quantity = 32; unset($a); $a[0] = "а"; $a[1] = "б"; $a[2] = "в"; $a[3] = "г"; $a[4] = "д"; $a[5] = "е"; $a[6] = "ж"; $a[7] = "з"; $a[8] = "и"; $a[9] = "й"; $a[10] = "к"; $a[11] = "л"; $a[12] = "м"; $a[13] = "н"; $a[14] = "о"; $a[15] = "п"; $a[16] = "р"; $a[17] = "с"; $a[18] = "т"; $a[19] = "у"; $a[20] = "ф"; $a[21] = "х"; $a[22] = "ц"; $a[23] = "ч"; $a[24] = "ш"; $a[25] = "щ"; $a[26] = "ъ"; $a[27] = "ы"; $a[28] = "ь"; $a[29] = "э"; $a[30] = "ю"; $a[31] = "я"; $word = strrev($word); $word = str_split($word); $word_len = count($word); $counter = $word_len; unset($new_word); $i = 0; while ($i < $word_len) { $g = 0; while ($g < $quantity) { if ($word[$i] === $a[$g]) { $t1 = $g + $counter; if ($t1 >= $quantity) { $t1 = $t1 - $quantity; } $temp = $a[$t1]; $new_word = $new_word . $temp; $counter = $counter - 1; } $g++; } $i++; } return $new_word; } echo "<form name=\"search\" action=\"$PHP_SELF\" method=\"POST\">"; echo "<input type=\"submit\" name=\"preobraz\" value=\"Преобразовать\">"; echo "<input type=\"text\" name=\"slovo\" size=\"90\">"; echo "</form>"; if ($preobraz) { echo perevod($slovo); } ?>
Зачем столько манипуляций и присваиваний, а? PHP: <?php $letters = range("а", "я"); ?> И зачем удалять переменную а в теле функции, причем явно в самом начале? Подозреваю, что кто-то не догадывается о локальный и глобальных областях.
по сути дела range выполняет те же самые функции, только в случае использования её процесс упрощается и оптимизируется до 1 строки, я же указывал элементы массива явным образом, что по факту абсолютно ничего не меняет, предварительно выполнив unset на случай "про запас" - если вдруг где-то в памяти от какой-то выполненной до этого программы осталась валяться переменная с таким же именем. На звание мегапрограммиста я не претендую, но думаю что хуже от unset всё равно в любом случае не будет, даже если она и не нужна, то это всего лишь 1 безобидная лишняя операция.
изначально есть слово, но оно как бы "закодировано" с использованием простого алгоритма "переворачивания" букв и хождения по алфавиту на число шагов вперед или назад, равное положению буквы в слове. Функция "расшифровывает" это слово и переводит его в человеческий вид
да, ага, пардон, перепутал, надо попробовать "ярослав", тогда будет выходить йжрхста (т.е. я изначально неправильно сказал - она нормальное слово наоборот переводит в "закодированное" слово)