2016-07-23 7 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); 

मैं इसे 'पचहत्तर गज की दूरी पर बाहर' के रूप में मुद्रित करने के लिए कैसे मिलेगा यह पाठ के सबसे वास्तविक निकट होगा? मैं शब्द में विभाजित करने की सोच रहा था एक प्रतिशत प्राप्त करने के लिए गिनती, लेकिन अब लगता है कि अब काम कर सकते हैं ..

उत्तर

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

आपका स्वागत है। साथ ही जब आपने जेर्डडिजिटी के जवाब को स्वीकार किया है तो आपको उसे एक संशोधन करने के लिए कहा जाना चाहिए क्योंकि तारों के भीतर दोहराए गए शब्दों की संख्या उनके कोड में ध्यान नहीं दे रही है। @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

हाँ इस महान काम करता है, लेकिन आप थोड़े मुझे यह कैसे काम करता है, जहां यह $ ग्राम, $ ख और $ n के माध्यम से पाशन है पर खो दिया ? क्षमा करें मैं इसके लिए नया हूँ .. धन्यवाद! @jerdiggity –

+1

@RyanD यह लूप पर $ g, $ b और $ n के माध्यम से खोज करता है। 'के लिए ($ inc = 'a'; $ inc <'t'; $ inC++) { अगर (जारी ($$ 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

संबंधित मुद्दे

 संबंधित मुद्दे