2015-01-31 9 views
1

Я застрял в написании функции PHP, которая будет соответствовать 2 символам. Вот пример. Это мой массив 1Соответствие строк PHP

$arr1 = array(
    "ABC" => 'c4', 
    "A" => 'c1', 
    "AC" => 'c2', 
    "ACC" => 'c3', 
    "aBC" => 'c5', 
); 

И это массив 2

$arr2 = array('ACXMASD','aCXMASD','ACCXMASD','ABCDXMASD','ABXAAAAS'); 

Что теперь мне нужно найти это матч закрывается в Ключах массива 1 и значениях массива 2

Учитывая ACXMASD:

Сейчас пока compairing это с моим массивом 1. Я должен AC как ближайший матч, а не или ACC

Аналогично с учетом ABXAAAAS. Я должен получить «А» как лучший матч, а не АВС.

Другими словами, я хочу, чтобы клавиши точно соответствовали строке.

Я пробовал этот код, который я нашел из 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 возвращается с4. Но я ожидаю, что он вернет c1, потому что этот ключ полностью совпадает. ключ со значением c4 - ABC, но моя строка имеет ABX.

Благодаря

+6

Я не думаю, что вы понимаете, что расстояние Левенштейна есть. – Barmar

+5

Для изменения 'A' на' ABXAAAAS' требуется добавить 'BXAAAAS', это расстояние 7. Для изменения 'ABC' на' ABXAAAAS' требуется заменить 'C' на' X' и добавить 'AAAAS', это расстояние только 6. – Barmar

+0

Я вижу. Позвольте мне попробовать сыграть с этим. Вы думаете, что я в правильном направлении. Я имею в виду, что мне действительно нужно использовать расстояние Левенштейна, или это может быть сделано с помощью некоторых других способов в PHP (если вы понимаете, что мне нужно). Еще раз спасибо –

ответ

0

Это может быть то, что вы искали:

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

} 
?> 
+0

Вряд ли «лучший случай» – symcbean

+0

Я просто следую за тем, что сказал Бармар. Я использовал strpos, а затем нашел самую длинную строку. $ a = "ACCXMASD"; \t $ arr2 = массив ( \t \t "ACC" => 'c3', \t \t "ABC" => 'c4', \t \t "AC" => 'c2', \t \t "Abc" = > 'c5', \t \t "A" => 'c1', \t); \t \t Foreach ($ arr2 как $ ключ => $ v) { \t \t, если (StrPos ($ а, $ ключ) === 0) { \t \t \t $ M [] = $ ключа; \t \t} \t} print_r ($ m); –