在PHP中求多个数组的交集,其中数组数量未知

15

我试图求交集一个任意数量的PHP数组,这个数量取决于用户提供的参数,每个数组中的元素数量也可以是任意的。

例如: array1(1, 2, 3, 4, 5) array2(2, 4, 6, 8, 9, 23) array3(a, b, 3, c, f) ... arrayN(x1, x2, x3, x4, x5 ... xn)

由于array_intersect需要一系列参数,我不能建立一个数组包含这些数组再求交集。我尝试了这个解决方案:http://bytes.com/topic/php/answers/13004-array_intersect-unknown-number-arrays ,但是它并没有起作用,因为报告了一个错误:array_intersect要求至少两个参数。

有人有什么好的想法来以最简单的方式实现这个功能吗?

5个回答

43
创建一个新的空数组,将你的每个数组添加到其中,然后使用call_user_func_array()函数。
$wrkArray = array( $userArray1,
                   $userArray2,
                   $userArray3
                 );
$result = call_user_func_array('array_intersect',$wrkArray);

已经尝试过了,如我原始问题中所提到的链接。这是我得到的错误:“警告:array_intersect() [<a href='function.array-intersect'>function.array-intersect</a>]:至少需要2个参数,但只提供了1个...” - Swader
我太傻了,我错过了call_user_func的“_array”部分!谢谢! - Swader
1
@swader - 犯这种错误很容易...不要对自己太苛刻了 :-) - Mark Baker

4
$arrays = [
    $userArray1,
    $userArray2,
    $userArray3
];
$result = array_intersect(...$arrays);

3

不要使用eval()!

试试这个

$isect = array();
for ($i = 1; $i <= $N; $i++) {
    $isect = array_intersect($isect, ${'array'.$i});
}

或者那个。
$arrays = array()
for ($i = 1; $i <= $N; $i++) {
    $arrays[] = ${'array'.$i};
}
$isect = call_user_func_array('array_intersect', $arrays);

1
如果你真的要这样做,请使用 **${'array' . $i}**。 - eisberg
第一个选项不起作用,因为结果被初始化为空数组,以下交集的结果将始终为空数组。 - Matt Nolan

1

我很晚才发布我的答案,但是我想分享一小段代码,如果有人需要这个问题的话,它可以帮助我。

print_r(array_intersect(array_merge($array1,$array2,...),$intersectionArr);

希望这能有所帮助
谢谢

-1

在编程中,可以使用展开运算符(...)来实现: array_intersect(...$arrayOfArrays) 或者可互换使用的 call_user_func_array

这个教程中的代码如下: https://www.youtube.com/watch?v=AMlvtgT3t4E


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接