Я застрял в написании PHP-функции, которая будет соответствовать 2 символов. Вот пример. Это мой массив 1
$arr1 = array(
"ABC" => 'c4',
"A" => 'c1',
"AC" => 'c2',
"ACC" => 'c3',
"aBC" => 'c5',
);
И это Массив 2
$arr2 = array('ACXMASD','aCXMASD','ACCXMASD','ABCDXMASD','ABXAAAAS');
Теперь то, что мне нужно найти, — это закрытое совпадение в Keys of Array 1 и Values of Array 2
Учитывая ACXMASD:
Теперь, сравнивая его с моим массивом 1. Я должен AC как ближайший матч, а не A или ACC
Аналогично, учитывая ABXAAAAS. Я должен получить «А» как лучший матч, а не ABC.
Другими словами, я хочу, чтобы ключи точно совпадали со строкой.
Я пробовал этот код, который я нашел из stackoverflow. Но проблема с этим заключается в следующем.
Моя функция
function findClosestMatchingString($s) {
$stringEditDistanceThreshold = 7;
$arr2 = array(
"ABC" => 'c4',
"A" => 'c1',
"AC" => 'c2',
"ACC" => 'c3',
"aBC" => 'c5',
);
$closestDistanceThusFar = $stringEditDistanceThreshold + 1;
$closestMatchValue = null;
foreach ($arr2 as $key => $value) {
$editDistance = levenshtein($key, $s);
echo "$editDistance <br/>";
// exact match
if ($editDistance == 0) {
return $value;
// best match thus far, update values to compare against/return
} elseif ($editDistance < $closestDistanceThusFar) {
$closestDistanceThusFar = $editDistance;
$closestMatchValue[] = $value;
}
}
return $closestMatchValue; // possible to return null if threshold hasn't been met
}
$arr1 = array('ACXMASD','aCXMASD','ACCXMASD','ABCDXMASD','ABXAAAAS');
// do the mapping
print_r(findClosestMatchingString('ABXAAAAS'));
Теперь проблема в том, что print_r возвращает c4. Но я ожидаю, что он вернет c1, потому что этот ключ полностью совпадает. ключ со значением c4 — это ABC, но в моей строке есть ABX.
Спасибо
Это может быть то, что вы искали:
<?php
$arr1 = array('ACXMASD','aCXMASD','ACCXMASD','ABCDXMASD','ABXAAAAS');
$arr2 = array(
"ABC" => 'c4',
"A" => 'c1',
"AC" => 'c2',
"ACC" => 'c3',
"aBC" => 'c5',
);
krsort($arr2);
foreach($arr1 as $val1)
{
echo "<br /> Searching for $val1";
foreach($arr2 as $var => $val2)
{
if(strpos($val1, $var) !== false)
{
echo "<br />Best Case for " . $val1 . " is " . $val2 . " " . $var . " <br />";
break;
}
}
}
?>
Других решений пока нет …