В былые времена мужик мне показывал свою функцию (сейчас с ним потеряна связь), которая создает для поля/ей ФИО число для сортировки так, что Абдурахманов и Пдурахманов находились рядом, а в основном сортировка совпадала с алфавитной. У него было что-то свое и очень простое, что-то типа суммы квадратов или произведения букв друг на друга. Левенштейн отличается тем, что он сравнивает две строки, а тут поле сорт и заполняется заранее при добавлении, независимо от других. Цель - автоматом демонстрировать опечатки ввода. Сам левенштейн для сравнения с пустой строкой не подходит PHP: <?php function sortf($str) { $base=''; return levenshtein ($base , $str ); } $a=array('Абдурахманов','Пдурахманов','Абдулаев','башибузуков','Васильков','пешеходов'); $b=array(); foreach ($a as $c) { $b[$c]=sortf($c); } echo '<pre>'; print_r($b); echo '</pre>'; ?>
Я нечто подобное делал на сайте с каптчами (когда вводишь сайт и ошибаешься, то выдает наиболее подходящий вариант из базы). Правда алгоритм достаточно неточен, но, вроде бы работает =) А сам алгоритм прост -- у каждого слова есть вес, вес этот составляется на сравнении вводимого и существующего: если схожи три буквы, то +1 к слову в базе, если схожи 2 буквы, то снова +1, ну и по одной. У кого самый большой вес, тот и наиболее подходит. Можно за три буквы три балла давать, думаю, что так лучше даже будет. Не знаю, на сколько это поможет в данной ситуации)
Нет, срс32 не покатит. попробуем так: сделаем близкими фамилии с одинаковыми длинами. PHP: </php function sort($str) { $n=0; for($i=0;$i<strlen($str);$i++) { $n+=(ord($str{$i})+1000); } return $n; } ?> правда, если в поле не только фамилии - то надо наверно обрезать по длине, точнее по первому пробелу.