2014-09-30 58 views
0
$searchable=array("Thailand,Chumphon" => "1", 
"Thailand,Kalasin" => "2", 
"Thailand,Kamphaeng Phet" => "3", 
"Thailand,Kanchanaburi" => "4", 
"Thailand,Khon Kaen" => "5", 
"Thailand,Krabi" => "6", 
"Thailand,Krung Thep Mahanakhon (Bangkok)" => "7", 
"Thailand,Lampang" => "8", 
"Thailand,Lamphun" => "9"); 

$searchvalue = "Thailand,Bangkok"; 

期望返回的值是7。匹配最接近的关联数组值

例如

function returnvalue($searchvalue,$searchable){ 

    } 

$returnedvalue = returnvalue($searchvalue,$searchable); 

echo $returnedvalue; // 7 

如何将$ searchable的最接近/最接近的值与$ searchvalue匹配? 我发现这个PHP - Nearest value from an array但只适用于数字。谁能帮忙?

+0

当你搜索''泰国,曼谷''时,你期望返回什么? – TeeDeJee 2014-09-30 12:46:07

+1

你究竟如何定义“最接近”?你的例子期望的结果是什么? – 2014-09-30 12:47:08

+0

我认为这将有助于:[链接](http://stackoverflow.com/questions/14136349/how-does-similar-text-work) – 2014-09-30 12:51:20

回答

0

您可以在php中使用函数similar_textlevenshtein

- 编辑

例如:

$textDistance = function($a, $b) { 
    return levenshtein($a, $b); 
}; 

function getClosest($search, $arr) { 
    $closest = null; 
    $closestVal = null; 
    foreach($arr as $label => $item) { 
     if($closest == null || $textDistance($search,$closest) > $textDistance($search,$label)) { 
     $closest = $label; 
     $closestVal = $item; 
     } 
    } 
    return $closestVal; 
} 
+0

除非你要举例说明如何在上下文中使用它们这个问题实际上更多的是评论而不是答案。 – 2014-09-30 12:57:10

+0

'levenshtein'不会产生所需的结果。 – georg 2014-09-30 13:12:17

0

怎么样以下?任何人都想要做得更好?

$searchable=array("Thailand,Chumphon" => "1", 
"Thailand,Kalasin" => "2", 
"Thailand,Kamphaeng Phet" => "3", 
"Thailand,Kanchanaburi" => "4", 
"Thailand,Khon Kaen" => "5", 
"Thailand,Krabi" => "6", 
"Thailand,Krung Thep Mahanakhon (Bangkok)" => "7", 
"Thailand,Lampang" => "8", 
"Thailand,Lamphun" => "9"); 

$searchvalue = "Thailand,Bangkok"; 

$returnedvalue = searchclosest($searchvalue,$searchable); 

echo $returnedvalue; //but the returned value is actually Thailand,Lamphun... it's bad. 


function searchclosest($input,$arrayinput){ 
     $shortest = -1; 
     $words=array(); 

     foreach($arrayinput as $key => $value){ 
       array_push($words,$key); 
     } 

     foreach ($words as $word) { 

       $lev = levenshtein($input, $word); 

       if ($lev == 0) { 

         $closest = $word; 
         $shortest = 0; 

         break; 
       } 

       if ($lev <= $shortest || $shortest < 0) { 
         $closest = $word; 
         $shortest = $lev; 
       } 
     } 

     return $closest; 
}