Bir dize içinde sözcüklerin PHP Çoklu Oluşumlarının

8 Cevap php

Ben herhangi bir kelime birden tekrarlarını olup olmadığını görmek için bir dize kontrol etmeniz gerekir. Böylece temelde kabul eder:

"Google sevişir"

ama ben kabul etmiyorum:

"Google google aşk yapar" ya da vb "google aşk sevgi google yapar"

Herhangi bir fikir? Gerçekten bu yaklaşımı hiçbir şekilde bilmiyorum, herhangi bir yardım büyük mutluluk duyacağız.

8 Cevap

Wicked Flea koduna göre:

function single_use_of_words($str) {  
   $words = explode(' ', trim($str));  //Trim to prevent any extra blank
   if (count(array_unique($words)) == count($words)) {
      return true; //Same amount of words
   }   
   return false;
}

Bu deneyin:

function single_use_of_words($str) {
  $words = explode(' ', $str);
  $words = array_unique($words);
  return implode(' ', $words);
}

Döngüler veya diziler için gerek yok:

<?php

$needle = 'cat';
$haystack = 'cat in the cat hat';

if ( occursMoreThanOnce($haystack, $needle) ) {
    echo 'Success';	
} 

function occursMoreThanOnce($haystack, $needle) {
    return strpos($haystack, $needle) !== strrpos($haystack, $needle);
}

?>
function Accept($str)
{
	$words = explode(" ", trim($str));
	$len = count($words);
	for ($i = 0; $i < $len; $i++)
	{
		for ($p = 0; $p < $len; $p++)
		{
			if ($p != $i && $words[$i] == $words[$p])
			{
				return false;
			}
		}
	}
	return true;
}

EDIT

Tüm test script. "False" php yazdırırken sadece bir şey ama gerçek "1" olarak yazdırılır yazdırır, unutmayın.

<?php

    function Accept($str)
    {
            $words = explode(" ", trim($str));
            $len = count($words);
            for ($i = 0; $i < $len; $i++)
            {
                    for ($p = 0; $p < $len; $p++)
                    {
                            if ($p != $i && $words[$i] == $words[$p])
                            {
                                    return false;
                            }
                    }
            }
            return true;
    }

echo Accept("google makes love"), ", ", Accept("google makes google love"), ", ",
	Accept("google makes love love google"), ", ", Accept("babe health insurance babe");


?>

Doğru çıktı yazdırır:

1, , ,

Düzenli ifade yolu kesinlikle benim seçim olacaktır.

Ben Veynom fonksiyonu ve düzenli bir ifade ile 320 kelime bir dize üzerinde küçük bir test yaptım

function preg( $txt ) {
    return !preg_match( '/\b(\w+)\b.*?\1/', $txt );
}

İşte testi

$time['preg'] = microtime( true );

for( $i = 0; $i < 1000; $i++ ) {
    preg( $txt );
}

$time['preg'] = microtime( true ) - $time['preg'];


$time['veynom-thewickedflea'] = microtime( true );

for( $i = 0; $i < 1000; $i++ ) {
    single_use_of_words( $txt );
}

$time['veynom-thewickedflea'] = microtime( true ) - $time['veynom-thewickedflea'];

print_r( $time );

Ve burada ben var sonuç var

Array
(
    [preg] => 0.197616815567
    [veynom-thewickedflea] => 0.487532138824
)

Hangi RegExp çözelti, hem de çok daha kısa olan iki kat daha hızlı daha fazla olduğunu göstermektedir. (320 kelime bir dize 1000 yineleme ANR)

Ben olsun 10 000 yineleme üzerinde testi çalıştırdığınızda

Array
(
    [preg] => 1.51235699654
    [veynom-thewickedflea] => 4.99487900734
)

Olmayan RegExp çözümü de çok daha fazla bellek kullanır.

Bu yüzden benim için .. Düzenli İfadeler, gaz dolu bir tank var çünkü

EDIT
The text I tested against has duplicate words, If it doesn't, the results may be different. I'll post another set of results.

Update
With the duplicates stripped out ( now 186 words ) the results for 1000 iterations is:

Array
(
    [preg] => 0.235826015472
    [veynom-thewickedflea] => 0.2528860569
)

Eşitler Hakkında

Bu oldukça hızlı görünüyor. Bu giriş dizesinin uzunluğunu artırmak gibi bellek kullanımı ve zaman artış çekilen nasıl (tüm cevaplar için) görmek ilginç olacaktır.

function check($str) {
    //remove double spaces
    $c = 1;
    while ($c) $str = str_replace('  ', ' ', $str, $c);

    //split into array of words
    $words = explode(' ', $str);
    foreach ($words as $key => $word) {
        //remove current word from array
        unset($words[$key]);
        //if it still exists in the array it must be duplicated
        if (in_array($word, $words)) {
            return false;
        }
    }
    return true;
}

Edit

Birden fazla boşluk ile sorun giderildi. Ben başında bu kaldırmak (benim gibi) veya her kelime foreachta olmayan boş olup olmadığını kontrol etmek daha iyi olup olmadığına emin değilim.

Basit yöntem her kelime döngü ve çiftleri için önceki tüm kelimeler karşı kontrol edin.