PHP数组交集不包括空数组

4

我有4个数组,每次运行代码时它们都会不同。有时,可能是空的。我正在使用array_intersect从数组集中获取公共值,如果其中任何一个数组为空,则会返回一个空数组。我希望array_intersect忽略空数组。

例如:

$array1 = array('441', '442', '443');
$array2 = array('441', '443');
$array3 = array('441', '442',);
$array4 = array();

var_dump(array_intersect($array1, $array2, $array3, $array4));

// Returns
array('');

// Required
array('441');

我该如何使其忽略$array4,并输出441


1
这就是函数的工作原理。其他任何事情都没有意义。在调用函数之前,您需要检查数组是否为空 - 然后将其包含在参数列表中或不包含。 - CBroe
1
我知道,但这正是我在问题中所问的。如何使array_intersect忽略空数组。 - Zain Sohail
总是只有4个数组吗? - GrumpyCrouton
是的,始终为4,但任何一个都可能为空。 - Zain Sohail
4个回答

15

如果您将数组存储为数组,则可以这样做:

<?php
// create array of arrays
$array[] = array('441', '442', '443');
$array[] = array('441', '443');
$array[] = array('441', '442');
$array[] = array();

// filter out empty array
$array = array_filter($array);

// pass in array (inline argument unpacking PHP > 5.6)
print_r(array_intersect(...$array));

Array
(
    [0] => 441
)

https://3v4l.org/MD3r2


2
$tempArray = [];
if (count($g_arr) >0) $tempArray[] = $g_arr;
if (count($c_arr) >0) $tempArray[] = $c_arr;
if (count($k_arr) >0) $tempArray[] = $k_arr;
if (count($m_arr) >0) $tempArray[] = $m_arr;
if (count($p_arr) >0) $tempArray[] = $p_arr;

$intersect = call_user_func_array('array_intersect', $tempArray);

我认为那是一个不好的做法! - Emy Blacksmith
为什么要使用 count()?你可以直接检查它是否为空(empty()),而且这些变量名一点都不具有描述性。 - GrumpyCrouton

2
请看下面的解决方案:
$array = array(); //initialize $arrar
$array[] = array('441', '442', '443');
$array[] = array('441', '443');
$array[] = array('441', '442',);
$array[] = array();
$array = array_filter($array); //filter empty array
$res_arr = array_shift($array); // Shift an element off the beginning of array
foreach($array as $filter){
        $res_arr = array_intersect($res_arr, $filter);
}

print_r($res_arr);

输出

Array ( [0] => 441 )

请查看示例: https://3v4l.org/Rkt1R

1
$array1 = array('441', '442', '443');
$array2 = array('441', '443');
$array3 = array('441', '442',);
$array4 = array();


function get_intersect(...$arrays){
    $instersect_arrays = array();

    foreach($arrays as $array){
        if(!empty($array)){
            array_push($instersect_arrays,$array);
        }
    }

    return call_user_func_array('array_intersect', $instersect_arrays);
}

var_dump(get_intersect($array1, $array2, $array3, $array4));

//output: array(1) { [0]=> string(3) "441" } 

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