我有以下代码:
$result = array_intersect($contacts1, $contacts2);
这会产生:
Array
(
[21] =>
[22] =>
[23] =>
[24] =>
[25] =>
[26] =>
[28] =>
我有以下if语句:
if (empty($result)) { // i.e. NO INTERECTION
我刚刚意识到这不会作为没有交集的测试,因为生成了许多元素,所有元素的值都为null。鉴于此测试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");