Вы можете использовать функцию php metaphone (), чтобы сгенерировать метафоновый код для каждого имени и сохранить их вместе с именами.
<?php
print "chris" . "\t" . metaphone("chris") . "\n";
print "christian" . "\t" . metaphone("christian") . "\n";
print "christine" . "\t" . metaphone("christine") . "\n";
# prints:
# chris XRS
# christine XRSTN
# christian XRSXN
Затем вы можете использовать алгоритм расстояния Левенштейна (либо в php [http://php.net/manual/en/function.levenshtein.php], либо в mysql [http://www.artfulsoftware.com/infotree/queries.php#552])], чтобы вычислить расстояние между метакодами. В моем тесте расстояние ниже 2 или меньше показало уровень сходства. что вы ищете.
<?php
$names = array(
array('mike',metaphone('mike')),
array('chris',metaphone('chris')),
array('chrstian',metaphone('christian')),
array('christine',metaphone('christine')),
array('michelle',metaphone('chris')),
array('mick',metaphone('mick')),
array('john',metaphone('john')),
array('joseph',metaphone('joseph'))
);
foreach ($names as $name) {
_compare($name);
}
function _compare($n) {
global $names;
$name = $n[0];
$meta = $n[1];
foreach ($names as $cname) {
printf("The distance between $name and {$cname[0]} is %d\n",
levenshtein($meta, $cname[1]));
}
}