2016-06-13 4 views
0

特定の条件で辞書から単語を削除したい。 次回の反復で、辞書は新しいアイテムを計算します。最後のアイテムは削除されているため、再度計算されません。オンザフライでアイテムをダブルループで削除

// sample data 
    $dict = ['aaa', 'aaan','aba', 'abat', 'ime', 'iso', 'nime', 'tiso',]; 
    $unique = ['abatiso', 'aaanime']; 

    // could use while to further optimize unset (and remove on the fly) http://php.net/manual/en/control-structures.foreach.php#88578 
    while (list($key_word, $word) = each($unique)) { // $key is unused, just for the optimization that the whille provides 
     foreach ($dict as $key_other => $other) { 

// ... conditions calculations 

     unset($unique[$key_word]); 
} 
} 
    echo "n compounds: " . count($compounds) . NL; 

は、私はしばらくの間、外のように代わりのforeachと内側のループを設定した場合、私は0結果を得る、それがinmediatelyを終了します。今の

、私は次のように重複した結果を取得しています:

   // Removed: abatiso => wc: aba + tiso = abatiso 
       // Removed: abatiso => wc: abat + iso = abatiso 
       // Removed: abatiso => wc: abati + so = abatiso 
       // Removed: abatiso => wc: abatis + o = abatiso 

どのように私はそれはそれは、単語を削除し、次の反復で再びそれをproccessないだろうことができますか?

いくつかのテストデータ:私も計算をしなければならないので、私は内側のループ内のブレークを使用していない

Removed: aaaaaah => wc: aaaa + aah = aaaaaah 
Removed: aaaaaah => wc: aaaaaa + h = aaaaaah 
Removed: aaaaargh => wc: aaa + aargh = aaaaargh 
Removed: aaaalead => wc: aaaa + lead = aaaalead 
Removed: aaabbbccc => wc: aaab + bbccc = aaabbbccc 
Removed: aaacomix => wc: aaa + comix = aaacomix 
Removed: aaagak => wc: aaa + gak = aaagak 
Removed: aaahh => wc: aaa + hh = aaahh 
Removed: aaainc => wc: aaa + inc = aaainc 
Removed: aaainc => wc: aaai + nc = aaainc 
Removed: aaanet => wc: aaa + net = aaanet 
Removed: aaanet => wc: aaan + et = aaanet 
Removed: aaanime => wc: aaa + nime = aaanime 
Removed: aaanime => wc: aaan + ime = aaanime 
Removed: aaaron => wc: aaa + ron = aaaron 
Removed: aabbcc => wc: aab + bcc = aabbcc 
Removed: aabmup => wc: aab + mup = aabmup 
Removed: aabre => wc: aab + re = aabre 
Removed: aabybro => wc: aaby + bro = aabybro 
Removed: aacap => wc: aac + ap = aacap 
Removed: aacap => wc: aaca + p = aacap 
Removed: aaccording => wc: aac + cording = aaccording 
Removed: aacd => wc: aac + d = aacd 
Removed: aachener => wc: aach + ener = aachener 
Removed: aachener => wc: aachen + er = aachener 
Removed: aacisuan => wc: aaci + suan = aacisuan 
Removed: aacisuan => wc: aacis + uan = aacisuan 
Removed: aacult => wc: aac + ult = aacult 

+0

あなたの質問や、コードの具体的下さい。 – Eiko

+0

@エイコあなたが理解していないものは? – Cristo

+0

私は現在、「for($ i = 0; $ i Cristo

答えて

0

コードに誤りがあります。 $keyの値は、2つの異なる意味で2つの場所に設定します。最初に、$dictの値のキー値の保持者としてステートメントでループをforeachループに割り当てます。

大まかには、そのリストを反復処理している間に、リストから要素をアンセットすることは決してうまくありません。処理したアイテムをリストに保存し、それらを再度処理しない方がよいでしょう。後でこれらのアイテムを削除するには、の後にの後にループを終了してください。unique

私はあなたの質問を理解していれば、正しくこれが移動するための方法のようになります。

$toUnset = []; 
foreach ($unique as $key => $word) { 
    if (!in_array($word, $toUnset)) { 
     foreach ($dict as $other) { 

      //do your processing 
      $toUnset[] = $word; 
     } 
    } 
} 
+0

申し訳ありませんが、私は$キーを使用していません。コードは非常に多くの進行中の変更と試行の少し乱雑です、私は訂正します。 私はそれを早く実行するようにしていますので、現在実行するのに約24時間かかります:D – Cristo

+0

あなたのディクテーションにはいくつのアイテムがありますか? 24時間は重大なランタイム問題のように聞こえます。 – cb0

+0

300kと110kのみ。ループ内のstrlenとstrposとカスタムbinary_search(dictsがソートされているため、組み込みPHP in_array/searchではなく)が遅すぎると思います。 私はisset対strlenハック(http://stackoverflow.com/questions/6955913/isset-vs-strlen-a-fast-clear-string-length-calculation)を試している、見て、約束する – Cristo

関連する問題