我正在尝试弄清楚如何比较多个数组并获得顶部对。
我有数组
$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
是最佳匹配对。
您可以使用
双foreach
、array_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)
}