从最长的短语中删除部分相似的单词

时间:2011-07-24 01:55:50

标签: php string

请考虑这个例子

Array
(
   [1] => search engine optimization
   [2] => engine optimization
   [0] => search engine
)

我想删除引擎优化和搜索引擎,因为这些单词已经是最长的短语。这些单词不是硬编码的,上述结果是由函数生成的。我尽力编写代码但无法解决这个问题。

修改

这是我的尝试,看起来这里的人不信任,他们擅长按下投票按钮。我的方法还不够,所以我不打算在这里分享。

$result = array('search engine', 'search engine optimization', 'engine optimization');
uasort($result, 'string_word_length');

foreach($result as $key=>$phrase) {
  if( ($found = array_find($phrase, $result, $key)) != FALSE) {
     unset($result[$found]);
  }
}

function array_find($needle, $haystack, $skip_key = 0) {
    if(!is_array($haystack)) return false;
        foreach($haystack as $key=>$value) {
            if($skip_key != $key && strpos($value, $needle)!==false) {
                 echo 'Poped ', $value, ' -- ', $key, ' -- ', $skip_key, '<br />';
                 return $key;
           }
    }
   return false;
}
function string_word_length($a,$b){
   return strlen($b) - strlen($a);
}

1 个答案:

答案 0 :(得分:2)

这个怎么样(假设你使用 php&gt; = 5.3 ):

$src = array('search engine optimization',
    'engine optimization',
    'search engine');

$src_array = array();
foreach ($src as $val) {
    $src_array[] = explode(' ', $val);
}

usort($src_array, function($a, $b) { return count($a) > count($b); });

foreach ($src_array as $key => $val) {
    if ($key + 1 < count($src_array)) {
        foreach ($val as $word_key => $word){
            for ($i = $key + 1; $i <= count($src_array) - 1; $i++) {
                if (in_array($word, $src_array[$i])) {
                    unset($src_array[$key][$word_key]);
                }
            }
        }
    }
}

$result = array_filter($src_array, function($i) { return count($i) > 0; });
$result = array_map(function($i) { return implode(' ', $i); }, $result);
$result = array_values($result);

var_dump($result);

对于那些没有安装php 5.3的人来说,输出结果为:array(1) { [0]=> string(26) "search engine optimization" }