2012-10-26 36 views
2

我有一堆单词。例如:将一组相似单词分组

array(developer,develop,development,design,designer,designing) 

我希望能集团这些话与他们相似的词放在一起,所以我会得到这样的事情:

array(
    array(develop, developer, development), 
    array(design, designer, designing), 
); 

什么是在PHP中做到这一点的最好办法?

回答

5

您可以轻松地使用metaphone()做到这一点:

$result = array(); 
foreach ($array as $word) { 
    $result[metaphone($word, 2)][] = $word; 
} 

print_r($result);将显示:

Array 
(
    [TF] => Array 
     (
      [0] => developer 
      [1] => develop 
      [2] => development 
     ) 

    [TS] => Array 
     (
      [0] => design 
      [1] => designer 
      [2] => designing 
     ) 
) 
+0

PHP API(如果你可以称它的话)让我惊叹不已。构建在语言中的有用“东西”数量非常惊人。 – Luke

+0

是的,几乎所有东西都有一个功能。其实这是惊人的:) – Carlos

2

您可能想要使用诸如“Porter Stemming”之类的技术来提取每个单词的词干以识别相似的单词,然后根据这些词干构建您的数组。你可以找到的波特施特默尔here

+0

我想过问这个问题前制止,但它可能是在性能上慢(我知道,过早优化是所有邪恶和所有这些的根源)。不管怎么说,还是要谢谢你! – Luke

3

一个PHP实现的一种方法是向正在添加我的脑海里

$array = array('developer','develop','development','design','designer','designing'); 

function matchWords(array $in,$pad='4') 
{ 
    $ret = array(); 
    foreach ($in as $v) { 
     $sub = substr($v, 0, $pad); 
     if (!isset($ret[$sub])) { 
      $ret[$sub] = array(); 
     } 
     $ret[$sub][] = $v; 
    } 

    return array_values($ret); 
} 

print_r(matchWords($array,4)); 

Array 
(
    [0] => Array 
     (
      [0] => developer 
      [1] => develop 
      [2] => development 
     ) 

    [1] => Array 
     (
      [0] => design 
      [1] => designer 
      [2] => designing 
     ) 
) 

这是你的数组值的$pad第一个字母相匹配,并且在其上创建一个关键。

+0

我很难决定接受你的答案或者杰克。最后,我实际上使用了提供的一个jackflash,所以我觉得我需要把它作为正确的答案。但是,如果我能够接受两个答案,我会的。我赞扬你对我的问题的快速回应!谢谢! – Luke

相关问题