比较多个数组并在 php 中制作一个顶级对


Comparing multiple arrays and make a top pair in php

我正在尝试弄清楚如何比较多个数组并获得顶部对。

我有数组

$A = array(1, 3, 4, 5);  
$B = array(1, 4, 3, 7);  
$C = array(2, 3, 6, 5);  
$D = array(1, 2, 6, 7);  
$E = array(2, 3, 4, 5);
.
.  
number of arrays will be N number

我需要的是将数组彼此与 php 中的最佳算法进行比较。

比较示例 :

$A,$B  $A,$C  $A,$D  $B,$C ..... till Nth pair

我需要这样的答案$A,$E 是顶级对,因为$A和$E匹配 - (3, 4, 5)。

我真的希望这是有道理的。

这是一个函数,利用array_intersect_assoc

function getBestMatch(/* provide arrays */) {
    $bestCount = -1;
    $args = func_get_args();
    foreach ($args as $i => $arg) {
        foreach (array_slice($args, $i+1) as $j => $arg2) {
            $count = count(array_intersect_assoc($arg, $arg2));
            if ($count > $bestCount) {
                $bestCount = $count;
                $result = array($i, $i+1+$j);
            }
        }
    }
    return $result;
}

以下是如何称呼它:

$result =  getBestMatch($A, $B, $C, $D, $E);

它给出了最佳匹配对(从零开始)的参数的编号。

var_export ($result)的输出为:

array (
  0 => 0,
  1 => 4,
)

。这意味着$A$E是最佳匹配对。

您可以使用

foreacharray_intersect(或自定义函数 calculateOverlap 在您的情况下)并将最大重叠数组的索引保存到参数中,并在功能结束时返回:

$A = array(1, 3, 4, 5);
$B = array(1, 4, 3, 7);
$C = array(2, 3, 6, 5);
$D = array(1, 2, 6, 7);
$E = array(2, 3, 4, 5);
$arrays = array($A, $B, $C, $D, $E);
function compareArrays($arrays) {
    $maxOverlap = 0;
    $overlapFirst = 0;
    $overlapSecond = 0;
    foreach ($arrays as $i => $first) {
        foreach ($arrays as $j => $second) {
            if ($i == $j) continue;
            //$overlap = count(array_intersect($first, $second));
            $overlap = calculateOverlap($first, $second);
            if ($overlap > $maxOverlap) {
                $overlapFirst = $i;
                $overlapSecond = $j;
                $maxOverlap = $overlap;
            }
        }
    }
    return [$overlapFirst, $overlapSecond, $maxOverlap];
}
function calculateOverlap($first, $second) {
    $overlap = 0;
    foreach ($first as $i => $item) {
        $overlap += ($item == $second[$i]) ? 1 : 0;
    }
    return $overlap;
}

相交的输出将是:

array(3) {
  [0]=>
  int(0)
  [1]=>
  int(1)
  [2]=>
  int(3)
}

使用自定义计算重叠函数的输出将是:

array(3) {
  [0]=>
  int(0)
  [1]=>
  int(4)
  [2]=>
  int(3)
}