如何获取两个结构不同数组的共有user_id,适配array_intersect或替代嵌套循环
高效解决方案
以下两种方案时间复杂度均为O(n+m),性能远优于嵌套循环的O(nm)*,适合大数据量场景使用:
方案1:哈希表匹配(性能最优)
利用PHP关联数组底层的哈希表结构,将单次查找的时间复杂度降到O(1):
- 遍历第一个数组,将所有
user_id作为关联数组的键存储,值可统一设为true - 遍历第二个数组,判断当前元素的
user_id是否存在于上述关联数组中,存在即属于交集
代码示例:
// $arr1、$arr2为你的两个异构数组,按实际结构取user_id即可 $userIdHash = []; foreach ($arr1 as $item) { $userId = $item['user_id']; // 对象数组可改为$item->user_id $userIdHash[$userId] = true; } $commonUserIds = []; foreach ($arr2 as $item) { $userId = $item['user_id']; if (isset($userIdHash[$userId])) { $commonUserIds[] = $userId; // 如果需要对结果去重,可加一行unset($userIdHash[$userId]); } }
方案2:适配array_intersect原生函数
先把两个数组的user_id单独提取为一维纯值数组,即可直接调用原生array_intersect计算交集:
// 提取两个数组的user_id为一维索引数组,对象数组同样支持array_column提取 $userIds1 = array_column($arr1, 'user_id'); $userIds2 = array_column($arr2, 'user_id'); // 直接计算得到同时存在的user_id交集 $commonUserIds = array_intersect($userIds1, $userIds2);
参考结构示例


内容的提问来源于stack exchange,提问作者SelvsterTP
相关产品推荐
相关产品推荐

