2016-12-30 8 views
0
$arr = ['This is text', 
     'This is also text', 
     'This is texts', 
     'These are texts' ]; 

similar_text($arr[0], $arr[2], $percent); 
echo $percent; // 96 

私は同様の要素を持つ配列を持っていますから、similar_text関数を実行して90%以上の要素を削除する必要があります。配列の要素を互いに比較する

同様の要素を削除するには、各要素を他の要素とそれぞれ比較する方法を教えてください。ネストされたforeachループ、またはarray_filterでエレガントな方法がありますか?

+1

0と2を比較してどちらを削除しますか?しかし、いずれも4に似ていません... – AbraCadaver

+1

各要素が90%+次のような状況になりますが、最初と最後は10%だけ似ていますが、それでもすべてが削除されます。これは非常に曖昧です。 – trincot

答えて

1

ネストループを使用できます。

$result = array(); 
foreach ($arr as $i => $text1) { 
    $keep = true; 
    for ($j = $i + 1; $j < count($arr); $j++) { 
     $text2 = $arr[$j]; 
     similar_text($text1, $text2, $percent); 
     if ($percent > 90) { 
      $keep = false; 
      break; 
     } 
    } 
    if ($keep) { 
     $result[] = $text1; 
    } 
} 

内側ループは、外側ループの現在の要素の後に開始します。これは、以前の繰り返しが以前の要素をすべてと既に比較しているためです。

+0

素敵でシンプルな、それは私がやろうとしたことですが、100k回以上これをやっているので、より効率的な方法があれば、私は考えました。とにかくありがとう。 – 3zzy

+0

私は内部ループを 'array_slice()'の代わりにインデックス変数を使うように変更しました。これはもっと効率的です。 – Barmar

+0

ボトルネックはすべて比較しており、避けるのは難しいです。 – Barmar

関連する問題