在PHP中按Levenshtein距离过滤值
我有两个数组,其中有地址。我想按levenshtein距离过滤重复项在PHP中按Levenshtein距离过滤值,php,arrays,Php,Arrays,我有两个数组,其中有地址。我想按levenshtein距离过滤重复项 $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 Addres
$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);
}`
但是我的uniqueArray中有3次company1。company1在这两个数组中出现了3次。所以,当您将$v1放入唯一数组时,它至少显示一次。然后,当它与公司4进行比较时,它会再次出现;当它与公司3进行比较时,它会再次出现。
我的建议是做一个调查
if(!isset($uniqueArray[$v1])
$uniqueArray[$v1] = $v1;
if(!isset($uniqueArray[$v2])
$uniqueArray[$v2] = $v2;
这将返回如下的关联数组
$uniqueArray = "Company1" => "Company1", "Company3" => "Company3", .....
您在
$uniqueArray
中有'company1'
三次,因为您是如何将值聚合到数组中的
让我们假设我是您的函数,您告诉我将$array1
中的所有值与$array2
中的每个值进行比较。您将$array1
中的“company1”传递给我,并告诉我将其与$array2
中的“company1”、“company4”和“company3”进行比较
// 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”)与$array2
中的“company1”进行比较。找不到匹配项,因此我们继续进行第一个循环的第三次也是最后一次迭代
现在你让我比较$array1[2]
中的“company2”和$array1
中的“company1”。这将导致1。因此,您可以再次将它们添加到$uniqueArray
中。最后,您的阵列将如下所示:
array(
'company1',
'company4',
'company1',
'company3',
'company1',
'company2'
);
相反,将逻辑更改为:
if ($levenshteinCompany > 0) {
$uniqueArray[$v1][] = $v2;
unset($array2[$k2]);
}
您如何使用levenshtein函数限制它?您使用的是任意距离吗?我使用php函数的返回值。我不知道你的意思。谢谢你的回答!我已经改变了我的逻辑,你的建议,但我得到一个非法的偏移量和一个空数组返回<代码>如果($levenshteinCompany>0){$uniqueArray[$v1][]=$v2;未设置($array2[$k2]);}