0

だから、私は2つの配列を手に入れました。最初$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 に答える