Задать вопрос
fleshherbal
@fleshherbal

Почему не срабатывает данный блок кода?

Функция должна заменять русские символы на английские через ассоциативный массив.
Но вызывается ошибка: " Warning: Undefined array key "" in /home/user/scripts/code.php on line 13"

<?php
	$associative_chars = array(
        "й"=>"y", "ц"=>"c", "у"=>"iy", "к"=>"k", "е"=>"e", "н"=>"n",
        "г"=>"g", "ш"=>"sh", "щ"=>"sh", "з"=>"th", "х"=>"h", "ф"=>"ph",
        "ы"=>"i", "в"=>"v", "а"=>"a", "п"=>"p", "р"=>"r", "о"=>"o",
        "л"=>"l", "д"=>"d", "ж"=>"j", "э"=>"e", "я"=>"ya", "ч"=>"ch",
        "с"=>"s", "м"=>"m", "и"=>"i", "т"=>"t", "б"=>"b", "ю"=>"yu" );

        $to_transcript = function($base_name, $associative){
        	$base_name = mb_strtolower($base_name);
                $result = "";
             
		 for ($i = 0; $i < strlen($base_name); $i++) { 
			$result .= $associative[$base_name[$i]];
	         }
	         
	         print_r($result);
    };
    $to_transcript("Виталий", $associative_chars)
?>
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 2
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Комментировать
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
strtr идеально подходит для этой задачи

<?php
$associative_chars = array(
        "й"=>"y", "ц"=>"c", "у"=>"iy", "к"=>"k", "е"=>"e", "н"=>"n",
        "г"=>"g", "ш"=>"sh", "щ"=>"sh", "з"=>"th", "х"=>"h", "ф"=>"ph",
        "ы"=>"i", "в"=>"v", "а"=>"a", "п"=>"p", "р"=>"r", "о"=>"o",
        "л"=>"l", "д"=>"d", "ж"=>"j", "э"=>"e", "я"=>"ya", "ч"=>"ch",
        "с"=>"s", "м"=>"m", "и"=>"i", "т"=>"t", "б"=>"b", "ю"=>"yu" 
);

$to_transcript = function($base_name, $associative) {
    $base_name = mb_strtolower($base_name);
    $result = strtr($base_name, $associative);
    print_r($result);
};

$to_transcript("Виталий", $associative_chars);


Не забывайте обработать кирилические символы с акцентами, так как например легко можете встретить украинскую Ї ї или белорусскую І і

https://en.wikipedia.org/wiki/Cyrillic_script
А	А́	А̀	А̄	Ӓ	Б	В	Г
Ґ	Д	Ђ	Ѓ	Е	Е́	Ѐ	Е̄
Ё	Є	Є́	Ж	З	З́	Ѕ	И
І	І́	Ї	Ї́	И́	Ѝ	Ӣ	Й
Ј	К	Л	Љ	М	Н	Њ	О
О́	О̀	Ō	Ӧ	П	Р	С	С́
Т	Ћ	Ќ	У	У́	У̀	Ӯ	Ў
Ӱ	Ф	Х	Ц	Ч	Џ	Ш	Щ
Ъ	Ъ̀	Ы	Ы́	Ь	Ѣ	Э	Э́
Ю	Ю́	Ю̀	Я	Я́	Я̀
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AleksandrB
@AleksandrB
Совсем недавно вывел "Hello world"
Потому что кириллица занимает на одну ячейку в памяти, а несколько, соответственно обращаться к ней как по индексу бессмысленно. Разбейте строку с помощью mb_str_split и бегите по нему.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Потму что у вас кириллица в utf-8 скорее всего, а это не один байт, и вы вместо того чтобы найти замену буквы ищите замену первой половине буквы, а затем второй половине.

Можно получать буквы через mb_substr() например.
https://ideone.com/N2Tffg
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы