PHP Сравнивает две строки и отображает разницу, сохраняя их исходные позиции символов

#php

Вопрос:

Для этого я сам пробовал разные вещи и уже некоторое время пытаюсь найти ответы в Интернете. Чего я хотел бы добиться, так это сравнить две строки и отобразить разницу в символах в виде целого числа, сохраняя при этом позиции символов. В принципе, у меня есть приложение для вопросов и ответов, и мне нужно сравнить правильный ответ с данным ответом. Так, например:

 $correct = 'Monday';
$answer =  'Manday';
 

В приведенном выше примере допущена только одна ошибка, поэтому при сравнении $correct строк $answer и мне нужно отобразить «1».

Я пробовал использовать strcmp , но это не дает мне правильных результатов. В приведенном выше примере это strcmp($original, $answer) дало бы мне такой результат: 3584.

Также при использовании similar_text я не получаю нужных мне результатов. Пример, при использовании similar_text($original,$answer) , при использовании вышеизложенного Monday и Manday примера, он дает ожидаемый результат в 5 одинаковых символов из 6. Но когда я делаю следующее, в результате все равно получается 1, в то время как должно быть 0 (для моего случая):

 similar_text("Hello", "World") // The "o" is matched, but it is in the wrong position
 

Короче говоря, мне нужно добиться вот чего. У меня есть правильный ответ и введенный пользователем ответ. Я хочу сравнить ответ, данный пользователем, с исходным правильным ответом. И как я хочу их сравнить? Я хочу сравнить каждую позицию символов в обеих строках, и для всех неверных символов я хочу вернуть общее количество неверных символов в виде целого числа.

Еще несколько примеров:

 $str1 = 'Monday';
$str2 = 'Mondayy';
 

Вышеизложенное должно возвращать «1», потому что вторая строка содержит дополнительный символ. Итак, всего 1 ошибка.

 $str1 = 'Monday';
$str2 = 'Manday';
 

Вышеизложенное должно возвращать «1», потому что вторая строка содержит один неверный символ. Итак, всего 1 ошибка.

 $str1 = 'Hello';
$str2 = 'World';
 

Вышеизложенное должно возвращать «5», потому что вторая строка не соответствует ни одному из символов первой строки в их положении. Итак, всего 5 ошибок.

Комментарии:

1. Возвращаемое значение strcmp() не имеет никакого значения. Важен только его знак.

2. Спасибо, я изучу эти методы немного подробнее, чтобы попытаться понять их лучше 🙂

Ответ №1:

Вы хотите использовать levenshtein() вместо similar_text()

similar_text() просто вычисляет самую длинную совпадающую подстроку. levenshtein() вычисляет, сколько символов необходимо заменить, чтобы они соответствовали ответу.

https://www.php.net/manual/en/function.levenshtein.php

Комментарии:

1. Я думаю, что это именно то, что я искал, хорошо, что я проглядел это… Потратил почти 30 минут на написание вопроса, лол, должен был найти это ^^ Большое спасибо!

2. Ну, я бы не подумал, что «левенштейн» соответствует множеству поисковых запросов, так что понятно, что вы его не нашли. Если это правильный ответ, пожалуйста, отметьте его как таковой.

3. Я, конечно, буду, Stackoverflow говорит мне подождать 5 минут :-)) И ПС. Я действительно levenshtein где-то находил раньше, но, думаю, просто выбросил это слишком быстро.. Ну что ж, вы мне очень помогли 🙂