Sen latin karakter kelimeleri transliterate ve kelime özünü almak ve sahip olanlar karşılaştırmak için Soundex gibi bir fonetik algoritma kullanabilir. Senin durumunda o C250 olan sonuncusu hariç sözlerin tümü için C252 olacaktır.
levenshtein veya similar_text gibi karşılaştırmalı fonksiyonları ile Edit sorun giriş değeri ve olası eşleşen değerin her bir çifti için onları aramak gerekir olmasıdır. Yani, 1 milyon girişleri ile bir veritabanı varsa bu fonksiyonları 1000000 kez aramak gerekir anlamına gelir.
Ama sindiriminin çeşit hesaplamak soundex veya metaphone gibi fonksiyonlar, gerçek karşılaştırmalar sayısını azaltmaya yardımcı olabilir. Eğer soundex ya da veritabanında bilinen her kelime için metaphone değerini saklamak varsa, çok hızlı bir şekilde olası eşleşmelerin sayısını azaltabilir. Olası eşleşen değer kümesi azalır Daha sonra, o zaman iyi maç olsun karşılaştırmalı işlevlerini kullanabilirsiniz.
İşte bir örnek:
// building the index that represents your database
$knownWords = array('Čakánka', 'Cakaka');
$index = array();
foreach ($knownWords as $key => $word) {
$code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
if (!isset($index[$code])) {
$index[$code] = array();
}
$index[$code][] = $key;
}
// test words
$testWords = array('cakanka', 'cákanká', 'ČaKaNKA', 'CAKANKA', 'CAAKNKA', 'CKAANKA', 'cakakNa');
echo '<ul>';
foreach ($testWords as $word) {
$code = soundex(iconv('utf-8', 'us-ascii//TRANSLIT', $word));
if (isset($index[$code])) {
echo '<li> '.$word.' is similar to: ';
$matches = array();
foreach ($index[$code] as $key) {
similar_text(strtolower($word), strtolower($knownWords[$key]), $percentage);
$matches[$knownWords[$key]] = $percentage;
}
arsort($matches);
echo '<ul>';
foreach ($matches as $match => $percentage) {
echo '<li>'.$match.' ('.$percentage.'%)</li>';
}
echo '</ul></li>';
} else {
echo '<li>no match found for '.$word.'</li>';
}
}
echo '</ul>';