array_intersect_key和array_diff_key之间的时间操作有何不同?

时间:2016-01-04 11:35:30

标签: php performance oop

$arr1 = ['value1','value2','value3','value4']; 
$arr2 = ['value1','value3'];

如果至少有一个交叉值被罚款,我的函数返回true:

function is_array_intersect($arr1,$arr2) {
    $arr1 = array_flip($arr1);
    $arr2 = array_flip($arr2);
    $intersectArr = array_intersect_key($arr1,$arr2);
    if (count($intersectArr)) {
        return true;
    }
    return false
}

是否有更好的方法以最短的操作时间实现此功能?

2 个答案:

答案 0 :(得分:1)

这可以简化。

$arr1 = ['value1','value2','value3','value4']; 
$arr2 = ['value1','value3'];
$arr3 = ['value1a','value3'];
$arr4 = ['value1a','value3a'];

echo "is_array_intersect()\n";
echo "arr2 = " . (is_array_intersect($arr1,$arr2) ? 'TRUE' : 'FALSE') . "\n";
echo "arr3 = " . (is_array_intersect($arr1,$arr3) ? 'TRUE' : 'FALSE') . "\n";
echo "arr4 = " . (is_array_intersect($arr1,$arr4) ? 'TRUE' : 'FALSE') . "\n";

echo "is_array_intersect2()\n";
echo "arr2 = " . (is_array_intersect2($arr1,$arr2) ? 'TRUE' : 'FALSE') . "\n";
echo "arr3 = " . (is_array_intersect2($arr1,$arr3) ? 'TRUE' : 'FALSE') . "\n";
echo "arr4 = " . (is_array_intersect2($arr1,$arr4) ? 'TRUE' : 'FALSE') . "\n";


function is_array_intersect($arr1,$arr2) {
    $arr1 = array_flip($arr1);
    $arr2 = array_flip($arr2);
    $intersectArr = array_intersect_key($arr1,$arr2);
    if (count($intersectArr)) {
        return true;
    }
    return false;
}

function is_array_intersect2($arr1,$arr2) {
    return count(array_intersect($arr1,$arr2)) > 0;
}

输出:

is_array_intersect()
arr2 = TRUE
arr3 = TRUE
arr4 = FALSE
is_array_intersect2()
arr2 = TRUE
arr3 = TRUE
arr4 = FALSE

请参阅操作代码:http://sandbox.onlinephpfunctions.com/code/912306c093a9dcc3b760cd6c84bdd95c0595b19b

答案 1 :(得分:1)

首先,你不应该在这里使用密钥,而是使用值。

嗯,在Set Theory中, diff intersect 是两种不同的操作。

根据手册:

array_diff

array array_diff ( array $array1 , array $array2 [, array $... ] )
  

将array1与一个或多个其他数组进行比较,返回   array1中不存在于任何其他数组中的值

array_intersect

array array_intersect ( array $array1 , array $array2 [, array $... ] )
  

array_intersect()返回一个包含array1所有值的数组   所有论点中都有。请注意,密钥会被保留。

所以,适合你的功能是array_intersect。然后你可以将你的函数重写为:

function is_array_intersect(array $arr1, array $arr2) {
    return count(array_intersect($arr1, $arr2)) > 0;
}