【问题标题】:Matching nearest associative array value匹配最近的关联数组值
【发布时间】:2014-09-30 12:42:49
【问题描述】:
$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,但仅适用于数字。有人可以帮忙吗?

【问题讨论】:

  • 当你搜索"Thailand,Bangkok"时你期望返回什么?
  • 您如何准确定义“最接近”?您的示例期望的结果是什么?
  • 我认为这会有所帮助:link

标签: php arrays


【解决方案1】:

你可以在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;
}

【讨论】:

  • 除非您要举例说明如何在问题的上下文中使用它们,否则这实际上更像是一个评论而不是一个答案。
  • levenshtein 不会产生预期的结果。
【解决方案2】:

下面呢?有人想做得更好吗?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2022-01-20
    • 2014-03-24
    • 1970-01-01
    相关资源
    最近更新 更多