2016-07-23 85 views
5

*從雷沃的回答

這裏更新的問題是工作腳本一套更好的例子字符串,以顯示我的intent-如何在PHP中使用多個數組值來迭代多個字符串?

$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); 

我怎麼會得到它打印「75碼出」爲這將是實際最接近文本?我想除以字數得到的百分比,但現在認爲,現在可能工作..

回答

2

的關鍵是在每個提供的字符串做str_word_count()分開。通過這種方式,我們正在轉換爲數組,處理數組對於您所期望的更加簡單。

array_count_values()對一個數組的值進行計數,這會導致出現單詞的次數。

$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)]; 

輸出:

seventy five yards out 

概率print_r($probabilities);

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

Live demo

+0

謝謝@revo這太棒了! –

+1

不客氣。同樣當你接受jerdiggity的回答時,你應該讓他做一個修改,因爲字符串中的重複單詞的數量在他的代碼中沒有考慮到。 @RyanD – revo

+0

雅這是什麼,我回答了他,我沒有看到他們被考慮在哪裏,以爲我只是失去了一些東西.. –

2

像這樣的東西應該工作:

<?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

是這個偉大的工程,但你有點失去了我它是如何工作的,在那裏它通過$克,$ B和$ N循環?對不起,新的這個..謝謝! @jerdiggity –

+1

@RyanD在for循環中搜索$ g,$ b&$ n。 ($ inc ='a'; $ inc <'t'; $ inC++){if(isset($$ inc)){$ {$ comp'[$$ inc] = str_word_count($$ inc,1); } }'。它被稱爲變量變量http://stackoverflow.com/questions/2715654/what-does-dollar-dollar-or-double-dollar-mean-in-php – MikeF

+1

@RyanD我更新了我的答案,更多的解釋...希望它清除一切。 :) – jerdiggity

0

在第一,你的問題問的出現次數爲好。但是,當你明顯走得更遠時,我覺得我應該爭取另一種解決方案。

similar_text()功能!

$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] : ""; 

輸出:

seventy five yards out 

Live demo

相關問題