检查两个数组是否只包含相同的键



如果两个数组的键相等,比较最快的方法是什么?

例如

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));

相关内容

  • 没有找到相关文章

最新更新