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";

expect the returned value to be 7.

e.g.

function returnvalue($searchvalue,$searchable){

    }

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

echo $returnedvalue; // 7

How do i match the nearest/closest value of $searchable to $searchvalue? I've found this PHP - Nearest value from an array but only for numbers. Can anyone help?

Community
  • 1
  • 1

2 Answers2

0

You can use function similar_text or levenshtein in php.

-- edit

For example:

$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;
}
krynio
  • 2,442
  • 26
  • 30
0

How about the below? Anyone wants to do better?

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