В чём ошибка? [php]

Рейтинг: 0Ответов: 1Опубликовано: 08.04.2023

Этот код должен возвращать сходство слов $w0 и $w1, за совпадение букв в одной и той же позиции он прибавляет 2 балла, за одинаковые буквы, но в разных позициях - 1балл. Но вместо 5*2 баллов он возвращает 20 баллов. Почему?

function b($w0,$w1,$y=2,$w=1){//Кол-во баллов совпадения у $w0 и $w1
    $i=0;
    $b=0;
    while($i<strlen($w0)){/*слова должны быть одинаковой длины*/
        if($w0[$i]==$w1[$i]){
            $b+=$y;
        }
        else if(r($w1,$w0[$i])){
            $b+=$w;
        }
        $i++;
    }
    return $b;
}
echo b("слово","слово",2,1);//20 баллов, а не 10 баллов.

Ответы

▲ 1

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

В вашем случае, вместо strlen() нужно использовть mb_strlen().

Подробнее: mb_strlen

Дока по Multibyte методам

Для примера:

echo "mb_strlen: ".mb_strlen("слово")."\n";
echo "strlen: ".strlen("слово")."\n";

Output:
mb_strlen: 5
strlen: 10

Сответую ознакомиться с документацией по строковому типу PHP, в частности последний раздел Подробности реализации строкового типа.