PHP: equal_beginning()

12.05.2011

Код здесь. Функция подобно similar_text() сравнивает две строки и если они одинаково начинаются, выдаёт длину одинакового фрагмента в символах. И также как в similar_text можно передать необязательный параметр $percent, в котором будет процентная схожесть этих двух строк (округляется до целого).

Важно! Не всегда умолчальная кодировка библиотеки mb_string стоит в UTF-8, поэтому для правильной работы функций из этой библиотеки имеет смысл в начале скрипта устанавливать кодировку такой строчкой: mb_internal_encoding('UTF-8');

Выяснилось, что в функции есть баг, проявляющийся с некоторыми словами. Загадка для программистов: приведите в пример пару слов, которые функция некорректно обрабатывает и объясните почему это происходит.

Произвёл рефакторинг :) Теперь со всеми словами отлично должно работать, и не используется преобразование строк в массивы. Функция стала проще и эффективней. Выкладывать пока не буду, разомните мозг.

Виталий в комментариях верно подметил слабое место первой дурацкой функции, так что загадка уже неактуальна. Вот новый вариант — http://pastie.org/1891195. Работает как надо.

Комментарии

  1. # tulvit

    приведите в пример пару слов, которые функция некорректно обрабатывает

    $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.

  2. # Тормоз

    И что? Для my и mysql вернёт правильный результат — две буквы.

  3. # tulvit

    У нас видимо разные пхп =)

    При

    $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) {
    }

  4. # Тормоз

    У меня функция выдаёт абсолютно одинаковые результаты независимо от порядка слов. PHP 5.3.6. Если у тебя какой-то допотопный PHP — так ты сам себе злобный Буратино :)

  5. # tulvit

    PHP Version 5.3.3-1ubuntu9.5

    Тем более из описания функции следует, что это у меня правильно работает, а у тебя нет =)

  6. # Тормоз

    У меня функция выдаёт абсолютно одинаковые результаты независимо от порядка слов.

    Блин, спать пора. Наврал! Извини, я в код equal_beginning_bug() добавил, а вызывал для проверки всё равно equal_beginning(), уже переписанную :)

    Да, и правда. Значит это ещё один дополнительный баг, я имел в виду другой.

  7. # Тормоз

    Тем не менее, всё равно ты в правильном направлении думал. Выкладываю изменённую функцию — http://pastie.org/1891195

    А проблемы были со словами «анализа» и «анализ», например. Потому что последняя «а» уже не попадала в массив сравнения. В общем, вообще первая функция дурацкая была, вторая значительно лучше.

  8. # tulvit

    Уря!!111 Я оказался прав!

    я имел в виду другой.

    Прям-таки квест какой-то =)

  9. # tulvit

    А последний вариант с кириллицей нормально работает? Или надо локаль указывать вручную?

  10. # Тормоз

    Для кириллицы и делалось всё, иначе всё гораздо проще. Но вообще у меня уже привычка в начале скриптов писать mb_internal_encoding('UTF-8');

  11. # tulvit

    mb_internal_encoding(‘UTF-8’);

    ИМХО, это надо отметить отдельно, а то сравнение, к примеру, ‘ф’ и ‘ы’ выдает 50% сходства.

  12. # Тормоз

    Добавил в заметку.

Комментирование этой статьи закрыто.

Интересное Покупки ТехникаРазное Отдых Статьи Строительство Услуги Общество Хобби Культура Советы Уют