2016-07-23 3 views
5

* Aktualisierte Frage von revo Antwort

Hier ist das Arbeitsskript mit einem besseren Satz von Beispiel-Strings meines IntentWie kann ich mehrere Strings mit mehreren Array-Werten in PHP durchlaufen?

$strings[] = 'seventy five yards out'; 
$strings[] = 'sixty yards out'; 
$strings[] = 'one hundred fifty yards out'; 

$inputString = 'seventy two yards out'; 
$inputWords = str_word_count($inputString, 1); 

$foundWords = []; 

foreach ($strings as $key => $string) { 
    $stringWords = str_word_count($string, 1); 
    $wordsCount = array_count_values($stringWords); 
    $commonWords = array_intersect($inputWords, array_keys($wordsCount)); 
    if (count($commonWords) > 0) { 
     foreach ($commonWords as $commonWord) { 
      $foundWords[$key][$commonWord] = $wordsCount[$commonWord]; 
     } 
    } 
} 

print_r($foundWords); 

zu zeigen, Wie würde ich es fünfundsiebzig Yards 'zu drucken bekommen als wäre es dem Text am nächsten? Ich dachte, das Wort des Teilens zählen einen Prozentsatz zu erhalten, aber jetzt denken, das könnte jetzt arbeiten ..

Antwort

2

Der Schlüssel ist ein str_word_count() auf jeweils Zeichenfolge separat zu tun . Auf diese Weise verwandeln wir uns in Arrays und der Umgang mit Arrays ist viel einfacher für das, was Sie wünschen.

array_count_values() zählt die Werte eines Arrays, die zur Anzahl der Wortvorkommen führen.

$strings[] = 'seventy five yards out'; 
$strings[] = 'sixty yards out'; 
$strings[] = 'one hundred fifty yards out'; 

$inputString = 'seventy two yards out'; 
$inputWords = str_word_count($inputString, 1); 

$probabilities = []; 

foreach ($strings as $key => $string) { 
    $stringWords = str_word_count($string, 1); 
    $wordsCount = array_count_values($stringWords); 
    $commonWords = array_intersect($inputWords, array_keys($wordsCount)); 
    if (count($commonWords) > 0) { 
     foreach ($commonWords as $commonWord) { 
      if (!isset($probabilities[$key])) $probabilities[$key] = 0; 
      $probabilities[$key] += $wordsCount[$commonWord]; 
     } 
     $probabilities[$key] /= count($stringWords); 
    } 
} 
arsort($probabilities); 
echo $strings[key($probabilities)]; 

Ausgang:

seventy five yards out 

Probabilities print_r($probabilities);:

Array 
(
    [0] => 0.75 
    [1] => 0.66666666666667 
    [2] => 0.4 
) 

Live demo

+0

danke @revo das ist großartig! –

+1

Gern geschehen. Auch wenn du die Antwort von Jerdigity akzeptierst, solltest du ihn bitten, eine Modifikation vorzunehmen, da die Anzahl der wiederholten Wörter in Strings in seinem Code nicht berücksichtigt wird. @ RyanD – revo

+0

Ya das ist irgendwie, was ich ihm antwortete ich nicht sah, wo sie berücksichtigt wurden, dachte, ich war nur etwas fehlt .. –

2

So etwas wie dies funktionieren sollte:

<?php 

$g = 'the weather is nice'; // strings to loop through 
$n = 'the water is blue'; 
$b = 'that was a bad movie'; 

$t = 'hows the weather'; // example input 
$test = (str_word_count($t, 1)); // breaks out each word into array 

// Comparisons 
$comps = array(); 
// Array sums 
$sums = array(); 
// Search each variable that's been set, as long as it's less that 't' 
// A "for" loop will accept letters in addition to numbers, so we'll start with the 
// letter "a" and loop through each letter up to "s" (which is one less than "t") 
for ($inc = 'a'; $inc < 't'; $inc++) { 
    // Now, a variable assigned as $$inc will translate into $a, $b, $c ... $s 
    // and if $a, $b, $c, etc, are set... 
    if (isset($$inc)) { 
    // ... assign them to the $comps array with a key of $$inc 
    $comps[$$inc] = str_word_count($$inc, 1); 

    // For example, when the "for" loop reaches "f", nothing will be added to the 
    // $comps array because $f is not set above. 

    // But when it gets to "g" it'll find that $g HAS been set, and that it has a 
    // value of "the weather is nice". At this point the $comps array will now look 
    // like this: 
    // $comps['the weather is nice'] = array('the', 'weather', 'is', 'nice'); 

    // If you'd like to see this in action (since it might sound a little confusing), 
    // remove the # from the beginning of each of the following lines that start with # 
    // (there should be 10 total): 

    #print "<pre>The loop has reached the letter <b>{$inc}</b> for the value of "; 
    #print "<b>\$inc</b> and has found that <b>\${$inc}</b> HAS been set in the code.\n"; 
    #print "Adding another dollar sign to <b>\$inc</b> has had the following effects:\n"; 
    #print "- <b>\$inc</b> now looks like <b>\$\$inc</b> (from within the written part of the code)\n"; 
    #print "- <b>\$\$inc</b> translates into <b>\${$inc}</b> (the variable that is acually being evaluated)\n"; 
    #print "- <b>\${$inc}</b> evaluates to <b>{$$inc}</b>\n</pre>"; 
    } 
    #else { 
    # print "<pre>The loop has reached the letter <b>{$inc}</b> for the value of <b>\$inc</b>"; 
    # print " and has found that <b>\${$inc}</b> has NOT been set in the code, so it's being skipped.\n"; 
    #} 
} 
// Avoid errors by checking if empty or not 
if (!empty($comps)) { 
    foreach ($comps as $key => $comp) { 
    // Find intersections, if any 
    $candidates[$key] = array_intersect($test, $comp); 
    // Count the intersections 
    $counts[$key] = array_count_values($candidates[$key]); 
    // Add up the intersections 
    $sums[$key] = array_sum($counts[$key]); 
    } 
} 
$winner = ''; 
if (!empty($sums)) { 
    // Reverse sort $sums, putting the highest value first 
    arsort($sums); 
    // Flip $sums so we can extract the key 
    $flipped = array_flip($sums); 
    // Extract the first key off of $sums 
    $winner = array_shift($flipped); 
} 

print $winner; 
+0

Ja, das funktioniert gut, aber sie irgendwie verloren mich auf, wie es funktioniert, wo es durch $ g, $ b und $ n looping ? Entschuldigung, ich bin neu. Danke! @jerdiggity –

+1

@RyanD es durchsucht $ g, $ b & $ n auf der for-Schleife. 'für ($ inc = 'a'; $ inc <'t'; $ inC++) { if (isset ($$ inc)) { $ comps [$$ inc] = str_word_count ($$ inc, 1); } } '. Es heißt Variable Variable http://stackoverflow.com/questions/2715654/what-does-dollar-dollar-or-double-dollar-mean-in-php – MikeF

+1

@RyanD Ich aktualisierte meine Antwort mit ein wenig mehr Erklärung ... Hoffentlich klärt es auf. :) – jerdiggity

0

Bei der ersten, Ihre Frage wurde auch für die Anzahl der Ereignisse zu fragen. Aber als Sie klar weiter gingen, fühlte ich, dass ich für eine andere Lösung bieten sollte.

similar_text() funktionieren!

$strings[] = 'sixty yards out'; 
$strings[] = 'seventy five yards out'; 
$strings[] = 'one hundred fifty yards out'; 

$inputString = 'seventy two yards out'; 

$p = 0; 
$k = null; 
foreach ($strings as $key => $string) { 
    similar_text($inputString, $string, $percent); 
    if ($percent > $p) { 
     $p = $percent; 
     $k = $key; 
    } 
} 

echo !is_null($k) ? $strings[$k] : ""; 

Ausgang:

seventy five yards out 

Live demo

Verwandte Themen