如何在不使用多个isset(...)
的情况下检查是否在数组中设置了键我想到了类似的东西:
$arr1 = [
"keyA" => 1,
"keyB" => 2,
"keyC" => 3
];
$arr2 = ['keyB', 'keyD'];
$anyExists = empty(array_intersect($arr1, $arr2));
如果$arr2
的任何项目是$arr1
的关键字,则应评估为true。
它显然不起作用。但有没有使用循环的同样好的解决方案?
答案 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()
通话是一个不幸的要求,因为它肯定是更快的选择。此外,通过将调用写入有条件的break
或return
的循环中,将再次提高其效率。
代码:(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
。