【问题标题】:How to check if an array has given keys如何检查数组是否有给定键
【发布时间】:2019-06-16 14:26:29
【问题描述】:

从性能的角度来看,检查关联数组是否具有且仅具有给定键集的最佳方法是什么?同样的问题,但从代码简洁的角度来看?

function checkArrKeys(array $arr, array $keys):bool {
    $arrKeys=array_keys($arr);
    sort($arrKeys);
    sort($keys);
    return $arrKeys===$keys;
}

function checkArrKeys(array $arr, array $keys):bool {
    return ($cnt = count(array_intersect(array_keys($arr), $keys)))===count($arr) && $cnt===count($keys);
}

function checkArrKeys(array $arr, array $keys):bool {
    return !(array_diff_key($arr, array_flip($keys)) || array_diff_key(array_flip($keys), $arr));
}

【问题讨论】:

    标签: php arrays validation


    【解决方案1】:

    你可以简单地做到这一点,通过

     function ArrayKeysAreEqual(array $keys, array $arr)
     {
        return array_diff(array_keys($arr), $keys) === array_diff($keys, array_keys($arr)); // return true if matches
     }
    

    【讨论】:

    • 谢谢。同意它会起作用,但如果两者都为空,则与返回 true 相同。
    • 是的,如果两个数组都为空,它将返回true。
    【解决方案2】:

    不确定性能,但这是一种方式。
    将键与 array_keys 合并并计算值。
    然后删除所有值为 2 的内容,如果剩下的内容有所不同。

    $merged = array_diff(array_count_values(array_merge($keys, array_keys($arr))), [2]);
    

    https://3v4l.org/ATSHF

    【讨论】:

    • 谢谢安德烈亚斯。这并不能确保在 $arr 中传递额外的密钥。
    • 发现自己每次都以不同的方式执行此操作,并希望选择一种方法并坚持下去。
    • 绝对没有想到那个! :)
    【解决方案3】:

    您可以在此使用 array_diff()count() 检查。

    function checkArrKeys(array $arr, array $keys):bool {
        return count(array_diff(array_keys($arr),$keys)) === 0 && count($keys) === count(array_keys($arr));
    }
    

    【讨论】:

    • 感谢 vivek_23,但不要认为这会确保所有密钥都通过。
    • @user1032531 没明白你的意思。有什么例子吗?
    • 如果$keys 有不在$arr 中的元素怎么办?根据文档:将 array1 与一个或多个其他数组进行比较,并返回 array1 中不存在于任何其他数组中的值。
    • @user1032531 已修复。我最初忽略了这一点,因为命名约定有点误导。
    • 啊,更好。类似于我的中间示例。我想我更喜欢你的。
    【解决方案4】:

    Just compare them:

    function checkArrKeys(array $arr, array $keys):bool {
        $arrayKeys = array_keys($arr);
        sort($arrayKeys);
    
        return $arrayKeys === $keys; // 
    }
    

    $a = ['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4];
    $A = ['b'=>2, 'c'=>3, 'd'=>4, 'a'=>1];
    
    $b = ['a'=>1, 'b'=>2, 'c'=>3];
    $c = ['a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'e'=>5];
    
    
    $keys = ['a','b','c', 'd'];
    var_dump(array_keys($a)===$keys); // true
    var_dump(array_keys($A)===$keys); // false
    var_dump(array_keys($b)===$keys);  // false
    var_dump(array_keys($c)===$keys);  // false
    
    function checkArrKeys(array $arr, array $keys):bool {
        $arrayKeys = array_keys($arr);
        sort($arrayKeys);
    
        return $arrayKeys === $keys; // 
    }
    echo "\n";
    
    var_dump(checkArrKeys($a, $keys)); // true
    var_dump(checkArrKeys($A, $keys)); // true
    var_dump(checkArrKeys($b, $keys)); // false
    var_dump(checkArrKeys($c, $keys)); // false
    

    Try it online

    【讨论】:

    • 我认为它不起作用。我原本打算做同样的事情,但是索引会不同,因此不会相等。希望我错了,因为我认为这绝对是最易读的。
    • 我添加了一些你可以在网上看到的例子
    • 之所以有效,是因为它们恰好处于相同的顺序。尝试将$keys 更改为['c','b','a', 'd']
    • 是的,这就是我实现sort()的原因
    猜你喜欢
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2018-06-15
    • 2018-06-14
    • 2020-02-20
    • 2012-06-05
    相关资源
    最近更新 更多