php array_intersect关联和索引数组

时间:2017-03-24 19:28:30

标签: php arrays

如何在不使用多个isset(...)

的情况下检查是否在数组中设置了键

我想到了类似的东西:

$arr1 = [
"keyA" => 1,
"keyB" => 2,
"keyC" => 3
];

$arr2 = ['keyB', 'keyD'];

$anyExists = empty(array_intersect($arr1, $arr2));

如果$arr2的任何项目是$arr1的关键字,则应评估为true。 它显然不起作用。但有没有使用循环的同样好的解决方案?

2 个答案:

答案 0 :(得分:4)

因此,您希望在检查值而不是键时将键作为第一个数组中的值获取,并且如果!empty()不为空,则希望true返回false,如果$anyExists = !empty(array_intersect(array_keys($arr1), $arr2)); 则为array_intersect_key()它是空的:

$anyExists = !empty(array_intersect_key($arr1, array_flip($arr2)));

您可以使用$arr2 = ['keyB' => true, 'keyD' => true]; ,但是您需要翻转第二个数组以获取值作为键:

{{1}}

或者将数组定义为:

{{1}}

答案 1 :(得分:-1)

我发现不允许多次isset()通话是一个不幸的要求,因为它肯定是更快的选择。此外,通过将调用写入有条件的breakreturn的循环中,将再次提高其效率。

代码:(Demo

function anyKeyExists($haystack, $needles) {
    foreach ($needles as $needle) {
        if (isset($haystack[$needle])) {
            return true;
        }
    }
    return false;
}

$array = [
    "keyA" => 1,
    "keyB" => 2,
    "keyC" => 3
];

echo "noMatch: " , (int)anyKeyExists($array, ['keyD', 'keyF']) , "\n";
echo "oneMatch: " , anyKeyExists($array, ['keyB', 'keyD']) , "\n";
echo "twoMatches: " , anyKeyExists($array, ['keyA', 'keyC']) , "\n";

输出:

noMatch: 0
oneMatch: 1
twoMatches: 1

如果必须使用函数式编程,则通过仅使用empty()或{{1将输出数组转换为布尔值,就可以避免在与键相交后进行!!调用}}。

代码:(Demo

(bool)

(与先前代码段的输出相同)

P.s。显而易见,但如果不是这样,我将说明我的技术正在返回$array = [ "keyA" => 1, "keyB" => 2, "keyC" => 3 ]; echo "noMatch: " , (int)!!array_intersect_key($array, array_flip(['keyD', 'keyF'])) , "\n"; echo "oneMatch: " , !!array_intersect_key($array, array_flip( ['keyB', 'keyD'])) , "\n"; echo "twoMatches: " , !!array_intersect_key($array, array_flip(['keyA', 'keyC'])) , "\n"; true评估。我将false结果转换为false,以便将它们表示为(int)值而不是空字符串。 0在回显时表示为true