交集函数:array_intersect 可以处理不定量的数组

4
我正在创建一个分面搜索,并且尝试使用array_intersect来比较数组并查找匹配的输入项。
问题在于,随时根据用户选择的过滤器数量,我将有不同数量的数组: $array_1, $array_2, $array_3等。
如何创建一个动态的array_intersect函数呢?
这是我尝试过的方法:
$next_array = 0;
for($i = 0; $i < $array_count; $i++) {
    $next_array++;
    if ($i == 0) {
        $full_array = ${array_.$i};
    } else {
        if(!empty(${cvp_array.$next_array})) {
            $full_array = array_intersect($full_array, ${cvp_array_.$next_array});
        }
    }
}

------------- EDIT -------------

我将努力进一步缩小我的目标:

如果用户点击三个筛选器,这将导致创建三个数组,每个数组都有各自的结果:

Array_1 ( [0] => 2, [1] => 4, [2] => 6 )

Array_2 ( [0] => 1, [1] => 4, [2] => 6 )

Array_3 ( [0] => 6, [1] => 7, [2] => 8 )

我需要找到在所有数组中都出现的数字的代码。如果没有共同的数字,则会结束为false或其他内容。在上面的情况下,我需要检索6。如果只是前两个数组,则会返回4和6。

4个回答

16

试试这个:

$fullArray = array($array1, $array2, $array3...);
call_user_func_array('array_intersect', $fullArray);

1
解释为什么会有助于这个答案 - dove
1
如果$fullArray中的数组小于2个,则此函数会引发警告。我已将其包装为: if ( count ($fullArray) > 1) ) { ...call_user_func_array... } - Jelmer Keij

5

可以使用以下方法:

$intersect = array_intersect(...$fullArray);

2

首先,将这些数组转换成一个二维数组。然后,您可以使用 array_reduce 结合 array_intersect 来将可变数量的数组缩减为一个。


抱歉,我在努力理解您所说的将array_reducearray_intersect组合的意思 - 或许举个例子会有帮助吗? - geoctrl
类似这样的代码:$out = array_reduce($in,function(&$a,$b) {$a = array_intersect($a,$b);},Array()); - 你只需要把所有的单独数组放入一个名为 $in 的大数组中。 - Niet the Dark Absol
我把所有的数组放在一个名为$in的数组中,但它产生了这个错误:unexpected T_FUNCTION - 再次感谢您的时间。 - geoctrl
啊,你正在使用一个旧版本的PHP。好吧,你可以更新(这总是一个好主意),或者使用create_function('&$a,$b','$a = array_intersect($a,$b);');代替。 - Niet the Dark Absol

0

你可以使用 array_combine() 将这些数组合并成一个数组,命名为 $total_array, 然后使用 array_intersect($full_array, $total_array)。希望这对你有帮助。


请看我的上面编辑 - 我需要比较每个数组并找到在所有数组中匹配的值。 - geoctrl

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