2015-08-13 3 views
1

У меня есть два массива с адресами. Я хочу фильтровать дубликаты по левенштейну.Значение фильтра по Levenshtein Расстояние в PHP

$addresses1 = array (
    new Address("Company1", "Person1","Sirname1","Street One", "1", "11111", "City 1"), 
    new Address("Company1", "Person3","Sirname2","Street Two", "17", "22222", "City 2"), 
    new Address("Company2", "Person6","Sirname6","Street Three", "11", "33333", "City 3"),); 

$addresses2 = array (
    new Address("Company1", "Person1","Sirname1","Street One", "1", "11111", "City 1"), 
    new Address("Company4", "Person7","Sirname7","Street Five", "5", "55555", "City 5"), 
    new Address("Company3", "Person3","Sirname3","Street Six", "6", "66666", "City 6")); 

function compare ($array1, $array2){ 
    $uniqueArray = array(); 
    foreach($array1 as $k1 => $v1) { 
     foreach($array2 as $k2 => $v2) { 
      $levenshteinCompany = levenshtein($v1->getCompany(), $v2->getCompany()); 
      print_r ($levenshteinCompany); 
      if ($levenshteinCompany > 0){ 
       $uniqueArray[] = $v1; 
       $uniqueArray[] = $v2; 
       unset($array2[$k2]); 
      } 
     } 
    } 
    print_r($uniqueArray); 
}` 

Но у меня есть 3 раза компания1 в моем уникальном массиве.

+0

Как вы ограничивая его с помощью функции Левенштейна? Вы используете произвольное расстояние? –

+0

im используя возвращаемые значения функции php. Я не уверен, что вы имеете в виду. – mk2015

ответ

1

Компания 1 появляется три раза в двух массивах. Таким образом, он появляется хотя бы один раз, когда вы ставите $ v1 в уникальный массив. Затем он появляется снова, когда его сравнивают с Company4 и снова, когда он сравнивается с Company3.
Мое предложение сделать

if(!isset($uniqueArray[$v1]) 
    $uniqueArray[$v1] = $v1; 
if(!isset($uniqueArray[$v2]) 
    $uniqueArray[$v2] = $v2; 

Это возвращает ассоциативный массив как этот

$uniqueArray = "Company1" => "Company1", "Company3" => "Company3", ..... 
1

Вы имеете 'company1' в ваших $uniqueArray 3 раза из-за того, как вы агрегирование значений в массиве ,

Давайте сделаем вид, что я ваша функция, и вы говорите мне, чтобы сравнить все значения с $array1 с каждым значением от $array2. Вы передаете мне 'company1' от $array1 и скажите мне сравнить его с 'company1', 'company4' и 'company3' от $array2.

// iteration 1:1 
//   'company1',  'company1' 
levenshtein($v1->getCompany(), $v2->getCompany()) // 0 

// iteration 1:2 
//   'company1',  'company4' 
levenshtein($v1->getCompany(), $v2->getCompany()) // 1 

// iteration 1:3 
//   'company1',  'company3' 
levenshtein($v1->getCompany(), $v2->getCompany()) // 1 

// iteration 2:1 
//   'company1',  'company1' 
levenshtein($v1->getCompany(), $v2->getCompany()) // 0 

// iteration 3:1 
//   'company2',  'company1' 
levenshtein($v1->getCompany(), $v2->getCompany()) // 1 

В первый раз через петлю для сравнения «company1» к «» company1 получит 0. Тогда он сравнивает «company1» к «company4» и получает 1. Таким образом, я добавляю его в $uniqueArray.

Ваш код:

$uniqueArray[] = $v1; 
$uniqueArray[] = $v2; 

Прямо сейчас, это то, что $uniqueArray выглядит следующим образом:

array(
    'company1', 
    'company4' 
); 

Далее мы сравниваем 'company1' к 'company3' и получить 1 раз, поэтому мы добавим их в $uniqueArray снова. Теперь $uniqueArray будет выглядеть следующим образом:

array(
    'company1', 
    'company4', 
    'company1', 
    'company3' 
); 

И мы переходим ко второй итерации первого цикла. Поскольку вы говорите мне, чтобы отключить элементы от $array2 всякий раз, когда есть совпадение, единственным элементом, оставшимся в $array2, является «company1». Итак, теперь мы сравниваем второй элемент $array1 (который снова является «company1») с «company1» от $array2. Никаких совпадений не будет найдено, поэтому переходим к третьей и последней итерации первого цикла.

Теперь вы меня сравниваете 'company2' от $array1[2] до 'company1' от $array1. Это приведет к 1. Таким образом, вы снова добавите их в $uniqueArray. В конце концов, ваш массив будет выглядеть следующим образом:

array(
    'company1', 
    'company4', 
    'company1', 
    'company3', 
    'company1', 
    'company2' 
); 

Вместо этого изменить логику к этому:

if ($levenshteinCompany > 0) { 
    $uniqueArray[$v1][] = $v2; 
    unset($array2[$k2]); 
} 
+0

Спасибо за ваш ответ! Я изменил свою логику на ваш совет, но я получил незаконное смещение и возвратил пустой массив. 'if ($ levenshteinCompany> 0) { \t \t $ uniqueArray [$ v1] [] = $ v2; \t \t \t \t \t unset ($ array2 [$ k2]); \t \t \t \t} ' – mk2015

Смежные вопросы