在PHP中测试没有数组交集

时间:2015-06-01 00:09:42

标签: php

我有以下代码:

$result = array_intersect($contacts1, $contacts2);

这会产生:

Array
(
[21] => 
[22] => 
[23] => 
[24] => 
[25] => 
[26] => 
[28] => 

我有以下if语句:

if (empty($result)) { // i.e. NO INTERECTION

我刚刚意识到这不会作为没有交集的测试,因为生成了许多元素,所有元素的值都为null。鉴于此测试2个阵列交叉的最佳方法是什么?

2 个答案:

答案 0 :(得分:3)

如果数组中有NULL,那么array_intersect会将它们返回到两个数组中。

$contacts1 = array("bob", "jane", NULL, NULL);
$contacts2 = array("jim", "john", NULL, NULL);
$result = array_intersect($contacts1, $contacts2);
print_r( $result );
  

阵   (       [2] =>       [3] =>   )

您可以使用array_filter在交叉点之前过滤每个数组。它需要一个回调函数,但默认情况下将删除所有等于FALSE的条目,包括NULL。

$result2 = array_intersect(array_filter($contacts1), array_filter($contacts2));
print_r( $result2 );
  

阵   (   )

如果您只想专门过滤NULL或您的要求,请使用callback

function mytest($val) {
   return $val !== NULL;   
}
$result3 = array_intersect(array_filter($contacts1, "mytest"), array_filter($contacts2, "mytest"));
print_r( $result3 );
  

阵   (   )

答案 1 :(得分:2)

您可以检查所有值是否为空(如果您知道阵列中不存在空值)。 您可以使用array_filter功能。

例如:

$result = array_filter(array_intersect($contacts1, $contacts2));

这样,所有空值都将被删除,结果(如果不存在交叉点)将是一个空数组。

更新: 如评论中所述,这也将删除非空值。 修订版是使用回调函数:

function filterOnlyNulls($elem) {
    return $elem !== null;
}

$result = array_filter(array_intersect($contacts1, $contacts2), "filterOnlyNulls");