Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中按Levenshtein距离过滤值_Php_Arrays - Fatal编程技术网

在PHP中按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

我有两个数组,其中有地址。我想按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 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]);}