PHP中筛选键在另一数组值中的元素,求比指定方法更快的方案
关于筛选数组中键存在于另一数组的最快实现
好问题!咱们先把需求和现有方案的问题理清楚:你需要从$array_1里保留键存在于$array_2值列表中的元素,而且追求最快的执行速度,但你给出的现有方案其实存在逻辑错误——它根本得不到你想要的结果!
先纠正现有方案的问题
你写的:
$expected_array = array_intersect($array_1, array_combine($array_2, $array_2));
array_intersect()是比较两个数组的值,而不是键。比如$array_1['du']的值是34,array_combine($array_2, $array_2)生成的数组中'du'的值是'du',两者不相等,所以这个方案会返回空数组,完全不符合你的期望。
正确且高效的基础方案
要筛选键匹配的元素,应该用array_intersect_key(),配合array_flip()把$array_2转换成键为原数组值的数组(这样就能用键匹配逻辑):
$expected_array = array_intersect_key($array_1, array_flip($array_2));
这个方案是PHP内置函数组合,底层用C实现,效率非常高,是绝大多数场景下的最优选择。
有没有更快的极致方案?
如果你的数组规模特别大(比如十万级以上元素),可以尝试手动循环+isset()判断的方案,因为它避免了array_intersect_key()内部的一些额外逻辑:
$expected_array = []; // 先把$array_2转成键数组,O(n)时间 $allowed_keys = array_flip($array_2); foreach ($array_1 as $key => $value) { // isset()是O(1)的哈希表查找 if (isset($allowed_keys[$key])) { $expected_array[$key] = $value; } }
不过实际测试中,array_intersect_key()的性能通常和手动循环持平甚至略优,因为它是底层优化过的。只有当$array_1的元素数量远少于$array_2时,手动循环可能会有微小的性能优势。
总结
- 先抛弃你现有的错误方案,改用
array_intersect_key()+array_flip()的组合,这是正确且高效的标准实现。 - 追求极致性能的话,可以测试手动循环的方案,但大多数场景下内置函数已经是最快的选择。
内容的提问来源于stack exchange,提问作者Arșavin
相关产品推荐
相关产品推荐

