2013-08-06 24 views
3

我有17,000个字符串的数组。许多字符串有类似的比赛,例如:在PHP中查找顶部类似的字符串?

User Report XYZ123 
Bob Smith 
User Report YEI723 
User Report 
User Report 
Number of Hits 27 
Frank's Weekly Transaction Report 
Transaction Report 123 

什么是找到顶级的“相似字符串”的最佳方式?例如,使用上面的示例,我希望将“用户报告”和“交易报告”看作顶部“类似字符串”中的两个。

+0

不应该把“最相似的”改为“弗兰克的每周交易报告”和“交易报告123”? – MightyPork

+1

粗略的方法是使用'levenshtein()'来确定两个字符串之间的距离。 – Nadh

回答

0

没有给你所有的源代码来做到这一点,你可以通过数组并删除你认为无用的组件,就像任何带有数字的字母,等等。

然后,您可以使用array_count_values()并对该数组进行排序以查看涉及的顶级数组。

-1

如果你能得到所有的字符串作为一个数组和循环他们在一个foreach()这样的:

$string_array = array('string', 'string1', 'string2', 'does-not-match'); 
$needle = 'string'; 

$results = array(); 
foreach($string_array as $key => $val): 
    if (fnmatch($needle, $val): 
     $results[] = $val; 
    endif; 
endforeach; 

你应该结束其匹配$needle这些条目结束。作为替代​​你可以使用preg_match()和模式/string/i

$string_array = array('string', 'string1', 'string2', 'does-not-match'); 
$needle = '/string/i'; 

$results = array(); 
foreach($string_array as $key => $val): 
    if (!empty(preg_match($needle, $val)): 
     $results[] = $val; 
    endif; 
endforeach; 

注有使用空时(可能是问题),并通过)的preg_match的结果(:

此前PHP 5.5 ,empty()只支持变量;其他任何东西都会导致解析错误。换句话说,以下内容不起作用:空(trim($ name))。相反,使用trim($ name)== false。

没有错误应与PHP版本5.3.x < 5.4

+0

为什么'fnmatch'?这太可怕了。不妨使用'md5':s – Halcyon

+1

'fnmatch()检查传递的字符串是否与给定的shell通配符模式匹配。“来自PHP手册http://php.net/manual/en/function.fnmatch.php 这使得'fnmatch()'等效于'preg_match()' –

+2

输入是纯文本,没有正则表达式。如果其中一个输入字符串是''。*“',看起来完全不像'”字符串“'。 – Halcyon

0

发出你可以计算Levenstein distance每串与其他人相比,然后由该值排序。

$strings = array('str1', 'str2', 'car', 'dog', 'apple', 'house', 'str3'); 
$len = count($strings); 

$distances = array_fill(0, $len, 0); 

for($i=0; $i<$len-1; ++$i) 
    for($j=$i+1; $j<$len; ++$j) 
    { 
     $dist = levenshtein($strings[$i], $strings[$j]); 
     $distances[$i] += $dist; 
     $distances[$j] += $dist; 
    } 

// Here $distances indicates how of "similar" is each string 
// The lower values are more "similar" 
0

我想你可以通过每个字符串做一个foreach和消除你不想适用于特定搜索的人。然后通过一旦你离开(可能与另一个foreach),并不断缩小你有兴趣的字符串的数量,直到有几个。然后按照字母顺序排序。