2016-07-23 87 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

相关问题