You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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时,手动循环可能会有微小的性能优势。

总结

  1. 先抛弃你现有的错误方案,改用array_intersect_key()+array_flip()的组合,这是正确且高效的标准实现。
  2. 追求极致性能的话,可以测试手动循环的方案,但大多数场景下内置函数已经是最快的选择。

内容的提问来源于stack exchange,提问作者Arșavin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:47:31