Ваша первая проблема заключается в том, что fgets
возвращает текст , включая символ новой строки (и в зависимости от возврата каретки системы).
Ваша вторая проблема в том, что некоторые из "букв" не имеют длины "один символ" (а именно символы в кодировке Юникод в конце).
Ваша третья проблема заключается в том, что при изменении схемы шифрования могут возникнуть непредвиденные результаты. скажем, ваша схема шифрования просто так:
a => 1
b => 12
c => 2
текст 12
, который явно равен b
, вместо этого превратится в ac
(из-за порядка).
На мой взгляд, это приводит к выводу, что ответ Микмацкузы - лучший, особенно вторая часть его ответа, проходящая через шифротекстовый код по коду.
мое старое решение
Я бы, наверное, использовал
$data = str_replace(',', ' ', $data); // do this once, not every iteration
while($text = fgets($file) { // fgets returns false on eof
list($letter, $code) = explode(' => ', $text, 2);
$code = trim($code); // <-- removes whitespace and new lines and so on
$data = str_replace($code, $letter, $data);
}
обновление:
// expand the text, if no "=>" is found:
while(...) {
if(strpos($text, '=>') === FALSE) {
$text = fgets($text);
}
if(!trim($text)) { // completely empty lines, even after expanding (EOF)
break;
}
// rest as before
}