2016-07-23 12 views
5

* REVOの答えここ

から更新された質問のように私はそれが75ヤードを「印刷するになるだろうどのように私の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); 

を表示する例文字列の優れたセットでの作業スクリプトですそれは実際にテキストに最も近いでしょうか?私はこのような

答えて

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

はい、これは素晴らしい作品がありますが、ちょっと、それはどこが$ G、$ bと$ Nをループされ、どのように動作するかで私を失いました?申し訳ありませんが、これは新しいです..ありがとう! @jerdiggity –

+1

@RyanD forループで$ g、$ b&$ nを検索します。 ($ inc = 'a'; $ inc <'t'; $ inC++){ if(isset($$ inc)){ $ comps [$$ 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

関連する問題