PHP Dur Kelime Listesi

4 Cevap php

Ben kontrol etmek isterdim kelimelerin tam bir dizi, ve ben karşı kontrol etmek istediğiniz kelimelerin bir dizi var benim kod içinde bir stop sözcükleri ile ilgili oynuyorum.

Şu anda ben bir defada dizi bir döngü ve bunu yapmanın daha iyi bir yolu varsa durma kelime listesi vs onun in_array'in ama ben merak ediyorum sözcüğü kaldırarak ediyorum, ben array_diff baktım ve böyle ettik ancak eğer ben İlk dizinin birden stop sözcükleri var, array_diff sadece ilk geçtiği kaldırmak için görünür.

Odak daha çok hız ve bellek kullanımı ancak hız verildi.

Düzenle -

İlk dizi blog yorumlarına dayanarak tekil kelimeler, (bunlar genellikle oldukça uzun) ikinci dizi stop sözcükleri tekil kelime olduğunu. Açık yapmıyor için üzgünüm

Teşekkürler

4 Cevap

Using str_replace...

Basit bir yaklaşım değiştirmeleri karşılık, (şeyler aramak için) 'iğne' bir dizi alabilir, str_replace veya str_ireplace kullanmak ve 'haystacks' dizisi (şeyler olduğunu ) üzerinde çalışmaya.

$haystacks=array(
  "The quick brown fox",
  "jumps over the ",
  "lazy dog"
);

$needles=array(
  "the", "lazy", "quick"
);

$result=str_ireplace($needles, "", $haystacks);

var_dump($result);

Bu üretir

array(3) {
  [0]=>
  string(11) "  brown fox"
  [1]=>
  string(12) "jumps over  "
  [2]=>
  string(4) " dog"
}

Bir kenara, sondaki boşlukları temizlemek için hızlı bir şekilde bu yapraklar her element için trim aramak için array_map kullanmak olacaktır

$result=array_map("trim", $result);

Str_replace kullanmanın dezavantajı within kelimeler yerine sadece tam sözcükleri bulunan eşleşmeleri yerini alacak olmasıdır. Bu çözmek için, normal ifadeleri kullanabilirsiniz ...

Use preg_replace

Kullanarak bir yaklaşım preg_replace yukarıdaki çok benzer, ancak iğneler düzenli ifadeler vardır ve biz \ b ile maçın başında ve sonunda bir 'word sınırında' kontrol

$haystacks=array(
"For we shall use fortran to",
"fortify the general theme",
"of this torrent of nonsense"
);

$needles=array(
  '/\bfor\b/i', 
  '/\bthe\b/i', 
  '/\bto\b/i', 
  '/\bof\b/i'
);

$result=preg_replace($needles, "", $haystacks);

(A \ B matematiksel olarak) zaten iki sıralı diziler varsa, dizi B da dizi A her öğe kaldırmak için bu algoritmayı kullanabilirsiniz:

for ($i=0, $n=count($a), $j=0, $m=count($b); $i<$n && $j<$m; ) {
    $diff = strcmp($a[$i], $b[$j]);
    if ($diff == 0) {
        unset($a[$i]);
        $i++;
    }
    if ($diff < 0) {
        $i++;
    }
    if ($diff > 0) {
        $j++;
    }
}

Bu yalnızca O (n) adım gerektirir.

Başka bir yaklaşım kullanarak bir dizin için tuşları (as dizi B kelimeleri kullanmak olacaktır array_flip ), iterate the values of A and see if they are a key in the index using array_key_exists :

$index = array_flip($b);
foreach ($a as $key => $val) {
    if (array_key_exists($val, $b)) {
        unset($a[$key]);
    }
}

Yine, bu O (n) o Ey olacağını A her değer için B her bir değeri ararken önler olarak (n 2).

array_diff () çalışmalıdır.

$sentence = "the quick brown fox jumps the fence and runs";
$array = explode(" ", $sentence);
$stopwords = array("the","and","an","of");

print_r(array_diff($array,$stopwords));

Sonuç

Array
(
    [1] => quick
    [2] => brown
    [3] => fox
    [4] => jumps
    [6] => fence
    [8] => runs
)

Ben bu sitede test: http://sandbox.onlinephpfunctions.com/

ne in_array kullanma hakkında

http://au.php.net/manual/en/function.in-array.php

Fonksiyonu bir dizi bir iğne kabul eder.

bool in_array (mixed $ iğne, array $ samanlık [, bool $ sıkı])

alternatif stop deyişle döngü tek tek ve tüm maçları bulabiliriz