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

Почему не работает замена символов в строке PHP?

Привет! Есть задача, которую никак не могу решить. Она очень элементарная, нужно заменить символы в строке на русском, такими же символами строки на английском, например русскую о на английскую о, и делать это с вероятностью 33%. Для этого написала скрипт, но он почему то не работает, подскажите пожалуйста где ошибка. Мне кажется что тут происходит слет кодировки.

function fg($str){

    $first_arr = array("а", "о", "у", "е", "с", "х");
    $second_arr = array("a", "o", "y", "e", "c", "x");
    
    for ($index = 0; $index < strlen($str); $index++){
        for($j = 0; $j < count($first_arr); $j++){
            
            //echo $str[$index].' '.$first_arr[$j].'</br>';
            
            if($str[$index] == $first_arr[$j]){
                
                if(rand(1,3) == 2){
                    $str{$index} = $second_arr[$j];
                }
            }
        }
    }
    
    return $str;
}

echo fg("Ехал грека через реку видит грека в реке рак.");


В итоге, увы, все буквы русские :(
  • Вопрос задан
  • 155 просмотров
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Skillfactory
    Профессия Fullstack веб-разработчик на JavaScript и PHP
    20 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 1
@sagechild
программист php
Немного изменил. Теперь ваша функция производит замену.
function fg($str)
{
    $rusToEng = ["а" => "a", "о" => "o", "у" => "y", "е" => "e", "с" => "c", "х" => "x"];
    $strChanged = '';

    foreach (preg_split('//u', $str) as $char) {
        if ($rusToEng[$char] && rand(1, 3) == 2) {
            $strChanged .= $rusToEng[$char];
        } else {
            $strChanged .= $char;
        }
    }

    return $strChanged;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
dollar
@dollar
Делай добро и бросай его в воду.
У вас кодировка UTF-8.
В этой кодировке русские символы кодируются двумя байтами.
Поэтому здесь:
if($str[$index] == $first_arr[$j]){
вы сравниваете один байт с двумя байтами. Естественно, они не равны, так как длина разная.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽