(PHP 4 >= 4.0.1, PHP 5)
levenshtein — Изчислява Левенщайн разстояние между два низа
Левенщайн разстояние представлява минималния брой знаци, който трябва да замените, вмъкнете или изтриете, за да преобразувате str1 в str2 . Алгоритъмът е със сложност O(m*n), където n и m са дължините на str1 и str2 (по-точно в сравнение с similar_text(), която е със сложност O(max(n,m)**3), а консумира повече ресурси).
В най-простият си вид, функцията ще приеме само двата низа като параметри и ще изчисли просто броя на операциите за вмъкване, замяна или изтриване необходими за преобразуването на str1 в str2 .
При вторият вариант може да приеме 3 допълнителни параметъра, които дефинират стойността на операциите за вмъкване, замяна или изтриване. Този вариант обхваща по-общите случаи и е по-адаптивен от предния вариант, въпреки че не е толкова ефективен.
Един от низовете, който се използва за изчисляване на Левенщайн разстояние.
Един от низовете, който се използва за изчисляване на Левенщайн разстояние.
Дефинира стойността на вмъкването.
Дефинира стойността на замяната.
Дефинира стойността на изтриването.
Тази функция връща Левенщайн разстояние между двата низови аргумента или -1, ако един от низовите аргументи е с дължина над допустимите 255 знака.
Example #1 Пример за levenshtein()
<?php
// въвеждане на сгрешена дума
$input = 'carrrot';
// масив от думи, за които да се направи проверката
$words = array('apple','pineapple','banana','orange',
'radish','carrot','pea','bean','potato');
// все още не е намерено най-краткото разстояние
$shortest = -1;
// итериране с думите за да се намери най-близката
foreach ($words as $word) {
// изчисляване на разстоянието между
// изходната и текущата дума
$lev = levenshtein($input, $word);
// проверка за пълно съвпадение
if ($lev == 0) {
// най-близката дума е тази (пълно съвпадение)
$closest = $word;
$shortest = 0;
// изход от цикъла; намерено е точно съвпадение
break;
}
// ако разстоянието е по-малко от следващото най-близко разстояние
// ИЛИ ако следващата най-близка дума все още не е открита
if ($lev <= $shortest || $shortest < 0) {
// установяване на най-близкото съвпадение и най-близкото разстояние
$closest = $word;
$shortest = $lev;
}
}
echo "Изходна дума: $input\n";
if ($shortest == 0) {
echo "Точно съвпадение: $closest\n";
} else {
echo "Имате предвид: $closest?\n";
}
?>
Примерът по-горе ще изведе:
Изходна дума: carrrot Имате предвид: carrot?