比较2个数组,检查第一个数组的键是否在第二个中彼此接近

时间:2012-11-01 00:19:02

标签: php arrays

所以,我有两个数组。首先$main

(
    [0] => 4035
    [1] => 10065
    [2] => 10034
    [3] => 10039
    [4] => 4035     // <- this is key 0 from $inmain
    [5] => 4035     // <- this is key 2 from $inmain
    [6] => 4096     // <- this is key 1 from $inmain
)

第二个$inmain看起来像这样:

(
    [0] => 4035
    [1] => 4096
    [2] => 4035
)

我想检测来自$inmain的所有密钥是否在$main数组中相互“关闭”(无论顺序如何)。例如。您可以在键4,5,6上看到它们现在(但顺序不同)。

3 个答案:

答案 0 :(得分:1)

$close = false;

$perm = compute_all_permutations($inmain); // perm is a set of permutations

for($i = 0; $i < (count($main) - count($inmain)); $i++)
{
    $subperm = array();

    for($j = 0; $j < count($inmain); $j++)
    {
        $subperm[$j] = $main[$i + $j];
    }

    if($subperm is in $perm)
    {
        $close = true;
    }
}

if($close)
{
    // keys are close
}
else
{
    // keys aren't close
}

复杂度为O(N * M!),其中N是$ main的长度,M是$ inmain的长度

答案 1 :(得分:0)

此功能对您有所帮助:

function arrayclose($main, $inmain, $proximity=5/*adjust default here, or set on your function call*/){
 foreach($inmain as $val){
   $isclose=false;
   foreach($main as $val2){
     if(abs($val-$val2) <=$proximity)
       $isclose=true;
   }
   if(! $isclose) return false;
 }
 return true;
}

它会循环播放您要检查的所有项目。然后在里面,它循环在更大的列表上。较小数组中的每个元素必须在$proximity之内。如果没有命中,立即返回false。如果它通过所有循环而不返回false,则表示所有内容都在$proximity内,因此我们返回true。

答案 2 :(得分:0)

我想我只是将这些数组转换为'字符串',如下所示: $mainstr = "1000111"$inmainstr = "111"并使用strpos()