PHP: equal_beginning()
12.05.2011 технологии
Код здесь. Функция подобно similar_text() сравнивает две строки и если они одинаково начинаются, выдаёт длину одинакового фрагмента в символах. И также как в similar_text можно передать необязательный параметр $percent, в котором будет процентная схожесть этих двух строк (округляется до целого).
Важно! Не всегда умолчальная кодировка библиотеки mb_string стоит в UTF-8, поэтому для правильной работы функций из этой библиотеки имеет смысл в начале скрипта устанавливать кодировку такой строчкой: mb_internal_encoding('UTF-8');
Выяснилось, что в функции есть баг, проявляющийся с некоторыми словами. Загадка для программистов: приведите в пример пару слов, которые функция некорректно обрабатывает и объясните почему это происходит.
Произвёл рефакторинг :) Теперь со всеми словами отлично должно работать, и не используется преобразование строк в массивы. Функция стала проще и эффективней. Выкладывать пока не буду, разомните мозг.
Виталий в комментариях верно подметил слабое место первой дурацкой функции, так что загадка уже неактуальна. Вот новый вариант — http://pastie.org/1891195. Работает как надо.
Комментарии
Комментирование этой статьи закрыто.
« Сложно ли зарабатывать в партнёрке Daos-33? PHP: mb_str_split() »
$word1 = ‘my’;
$word2 = ‘mysql’;
array_diff_assoc
Returns an array containing all the values from array1 that are not present in any of the other arrays.
И что? Для my и mysql вернёт правильный результат — две буквы.
У нас видимо разные пхп =)
При
$word1 = ‘mysql’;
$word2 = ‘my’;
Вывод var_dump($diff)
array(3) { [2]=> string(1) «s» [3]=> string(1) «q» [4]=> string(1) «l»
}
При
$word1 = ‘my’;
$word2 = ‘mysql’;
array(0) {
}
У меня функция выдаёт абсолютно одинаковые результаты независимо от порядка слов. PHP 5.3.6. Если у тебя какой-то допотопный PHP — так ты сам себе злобный Буратино :)
PHP Version 5.3.3-1ubuntu9.5
Тем более из описания функции следует, что это у меня правильно работает, а у тебя нет =)
Блин, спать пора. Наврал! Извини, я в код equal_beginning_bug() добавил, а вызывал для проверки всё равно equal_beginning(), уже переписанную :)
Да, и правда. Значит это ещё один дополнительный баг, я имел в виду другой.
Тем не менее, всё равно ты в правильном направлении думал. Выкладываю изменённую функцию — http://pastie.org/1891195
А проблемы были со словами «анализа» и «анализ», например. Потому что последняя «а» уже не попадала в массив сравнения. В общем, вообще первая функция дурацкая была, вторая значительно лучше.
Уря!!111 Я оказался прав!
Прям-таки квест какой-то =)
А последний вариант с кириллицей нормально работает? Или надо локаль указывать вручную?
Для кириллицы и делалось всё, иначе всё гораздо проще. Но вообще у меня уже привычка в начале скриптов писать mb_internal_encoding('UTF-8');
ИМХО, это надо отметить отдельно, а то сравнение, к примеру, ‘ф’ и ‘ы’ выдает 50% сходства.
Добавил в заметку.