如何从数组php中删除类似的条目

时间:2015-03-27 12:39:31

标签: php arrays sorting

所以我有这样的数组,有时它有非常相似的条目:

Array
(
    [0] => greys anatomy
    [1] => element 3d
    [2] => interstellar
    [3] => monster ball
    [4] => scorpion
    [5] => taken 3
    [6] => the flash
    [7] => wild card
    [8] => big bang theory
    [9] => the big bang theory
    [10] => fredrik kempe vincero
    [11] => fredrik kempe vicero
)

我想删除较长的类似条目。例如,在此数组中:应删除[9] => the big bang theory[10] => fredrik kempe vincero个条目。因为它们类似于第8和第11条,但更长。

编辑: 因此,如果有人需要,我在下面的两个答案中提出了工作解决方案:

function check_similar($first, $second)
{
    similar_text($first, $second, $percent);
  if ($percent >= 80) { //needed percent value
    return true;
  }
  else {
    return false;
  }
}

for ($i = 0; $i < count($array); $i++) {
   for ($j = $i; $j < count($array); $j++) {
      if ($j > $i && check_similar($array[$i],$array[$j]) == true) {
         $array[$j] = null;
      }
   }
}
// filter array to remove null values and reindex
$array = array_values(array_filter($array));
print_r($array);

2 个答案:

答案 0 :(得分:1)

字符串相似性是一个非常难以解决的问题,无法轻易解决。有几种复杂的方法,但没有一种方法可以像人类一样有效。

查看php soundhexlevenshtein,这可能是您特定案例的简单解决方案。

在任何情况下,给定一个定义或不定义字符串是否与另一个字符串类似的自定义函数,为了使您的数组唯一,您必须执行以下操作:

// set to null all subsequent similar strings
for ($i = 0; $i < count($array); $i++) {
   for ($j = $i; $j < count($array); $j++) {
      if ($j > $i && similar($array[$i],$array[$j])) {
         $array[$j] = null;
      }
   }
}
// filter array to remove null values
$array = array_filter($array);

答案 1 :(得分:1)

查看similar_text功能。

similar_text('the big bang theory','big bang theory', $percent);
echo $percent; // 88%

这显然比看起来更难,但可以在制作此数组时进行此检查。

有关替代实施,请参阅此link