0

所以,我有两个数组。首先$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 上。

4

3 回答 3

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 的长度

于 2012-11-01T00:39:30.880 回答
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。

于 2012-11-01T00:39:35.340 回答
0

我想我会像这样将这些数组转换为“字符串”: $mainstr = "1000111"然后$inmainstr = "111"使用 strpos()

于 2012-11-01T01:11:44.540 回答