Для одного из своих сайтов написал код, который перенаправляет пользователя на правильную страницу при ошибке. Очень часто при написании ссылок на форумах люди теряют буквы или ошибаются в английской грамматике и так получается, что страница не найдена. Например, вместо services набирают servicе, или content вместо contents. Вариантов много, тоже portflio вместо portfolio. Есть скрипт (см. ниже), который это исправляет в случае 50% совпадения. Это только кусок кода, вырванный из полноценного скрипта: PHP: <?php // Copyright (c) Apple :: php.ru // Массив, куда будут помещены результаты $found = array(); // Существующие слова (в моём случае - страницы) $exists = array("contact", "portfolio", "services", "about", "contents"); /** * Перебор слов и рассчет релевантности */ foreach($exists as $word) { similar_text($_GET['wish'], $word, $found[$word]); } // Вывод результата в случае 50% совпадения if(max($found) >= 50) { echo "Возможно, вы имели в виду <b>" . array_search(max($found), $found); } else echo "Похожих страниц не найдено"; ?> Результат примерно следующий: Дело в том, что работает он так, как надо. Но то, как он выглядит и то, как он это делает ... знаю, что можно лучше. Вдохновила меня эта тема, в которой люди блещут умом =) Помогите оптимизировать код .. или рационализировать.
Нормально он всё делает. Просто спорный вопрос нужен ли этот скрипт при таком кол-ве страниц (они все есть в меню, отгадал? ). А при большом количестве страниц они все выглядят как чё-то/ещё-чё-то и насколько есть смысл использовать скрипт в данном случае. "чё-то" есть в меню, а "ещё-чё-то" мало кто руками и по памяти введёт.
Сайт, по большей части, статический. Т.е фиксированное количество разделов и многие из них представляют вложенные модули. Например, в услугах (модуль) есть регистрастрация домена (модуль) в который входит непосредственно регистрация, проверка, информация и пр., в свою очередь другие модули могут иметь такую же паутинную структуру. Отсюда получается, что страницы, относящиеся к конкретному модулю, могут быть в большом количестве. Например: services; services/domains; services/domains/registration; services/domains/checking. Или в случае с портфолио — разделы, года и работы, где сам адрес portfolio/ остается неизменным. Массив не перегружен ненужными именами страниц, в метод служебного (сервисного) класса передаётся массив возможных страниц для определенного модуля, который также может быть вложенным (service для корректировки services и domain для корректировки в domains одновременно). Поэтому, мне что-то не нравится вызов функции array_search.