如果两个数组的键相等,比较最快的方法是什么?
例如
array1: array2:
'abc' => 46, 'abc' => 46,
'def' => 134, 'def' => 134,
'xyz' => 34, 'xyz' => 34,
在这种情况下,结果应该是TRUE(相同的密钥)
和:
array1: array2:
'abc' => 46, 'abc' => 46,
'def' => 134, 'def' => 134,
'qwe' => 34, 'xyz' => 34,
'xyz' => 34,
结果应该是FALSE(有些键不同)
array_diff_key()
返回一个空数组
使用array_diff_key
,这就是它的用途。正如您所说,它返回一个空数组;这就是它应该做的。
给定array_diff_key($array1, $array2)
,如果array1的所有键都存在于array2中,它将返回一个空数组。为了确保数组相等,您需要确保array2的所有键都存在于array1中。如果任意一个调用返回非空数组,则表明您的数组键不相等:
function keys_are_equal($array1, $array2) {
return !array_diff_key($array1, $array2) && !array_diff_key($array2, $array1);
}
使用array_keys获取键数组,然后使用array_diff。
或
直接使用array_diff_key。
改为使用===怎么样?你知道吗,平等的运算符?
$array1 = array(
'abc' => 46,
'def' => 134,
'xyz' => 34
);
$array2 = array(
'abc' => 46,
'def' => 134,
'xyz' => 34,
);
var_dump( array_keys( $array1 ) === array_keys( $array2 ) );
与@user229044利用本机函数调用的答案相比,我将为同一进程提供一种polyfill,它经过优化,可以执行尽可能少的周期,即有条件地提前返回,并且在交换密钥正在验证的数组时从不重新检查给定的密钥两次。
代码:(演示显示钥匙在第二个循环中未被重新检查)
function allKeysFoundInBothArrays(array $array1, array $array2): bool
{
foreach ($array1 as $key => $notUsed) {
if (!key_exists($key, $array2)) {
return false;
}
unset($array2[$key]);
}
foreach ($array2 as $key => $notUsed) {
if (!key_exists($key, $array1)) {
return false;
}
}
return true;
}
var_export(allKeysFoundInBothArrays($array1, $array2));