PHP array_intersect() 函数(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

一、前言

在 PHP 开发中,数组操作是日常编程的核心任务之一。当需要比较两个或多个数组的元素,并找出它们的共同部分时,array_intersect() 函数便成为不可或缺的工具。无论是数据清洗、权限验证,还是业务逻辑中的复杂匹配,这一函数都能提供简洁高效的解决方案。然而,对于编程初学者和部分中级开发者来说,其使用细节与潜在陷阱可能尚未完全掌握。本文将通过 循序渐进 的讲解,结合 实际案例形象比喻,帮助读者系统理解 PHP array_intersect() 函数 的核心功能与应用场景。


二、函数基础:语法与核心逻辑

1. 函数语法

array_intersect() 的基本语法如下:

array array_intersect(array $array1, array $array2, ...arrayN): array  
  • 参数:第一个参数 $array1 是基准数组,后续参数为待比较的数组。
  • 返回值:返回一个 新数组,包含 $array1 中与所有其他数组 值相同 的元素。
  • 关键特性:仅比较 的相等性,不涉及 键名 的匹配。

形象比喻
可以将 array_intersect() 想象为 “购物车对比器”。假设你有两个购物车(数组),该函数会帮你筛选出两个购物车中 完全相同的商品,并忽略它们在货架上的摆放位置(键名)。


2. 基础案例:两个数组的交集

示例代码 1

$array1 = [10, 20, 30, 40];  
$array2 = [30, 40, 50, 60];  
$result = array_intersect($array1, $array2);  
print_r($result);  
// 输出:Array ( [2] => 30 [3] => 40 )  

解析

  • $array1$array2 的共同元素是 3040,因此结果保留这两个值。
  • 注意:结果数组保留了 $array1 的原始键名(如 [2][3]),但键名可能因输入数组的结构而异。

3. 多数组交集与关联数组

array_intersect() 可支持 三个或更多数组 的交集计算,并且对 关联数组 同样适用。

示例代码 2

$array1 = [1 => "苹果", 2 => "香蕉", 3 => "橙子"];  
$array2 = ["香蕉", "橙子", "芒果"];  
$array3 = [3 => "橙子", 4 => "荔枝"];  
$result = array_intersect($array1, $array2, $array3);  
print_r($result);  
// 输出:Array ( [3] => 橙子 )  

关键点

  • 只有 $array1 中的值 "橙子" 同时存在于 $array2$array3 中。
  • 键名保留规则:结果数组的键名始终来自 第一个参数数组(此处是 $array1 的键 3)。

三、进阶用法:深入细节与扩展技巧

1. 类型敏感的交集:array_intersect() vs array_intersect()

默认情况下,array_intersect()值的类型不敏感,即 5(整数)和 "5"(字符串)会被视为相等。若需严格比较类型,可使用 array_intersect()类型敏感变体 array_intersect()(注:PHP 无此变体,需通过 array_uintersect() 自定义比较规则)。

示例代码 3

$array1 = [1 => 5, 2 => "5"];  
$array2 = [3 => "5", 4 => 5];  
// 默认行为:返回所有值为 "5" 或 5 的元素  
$result = array_intersect($array1, $array2);  
// 输出:Array ( [1] => 5 [2] => 5 )  

解决方案
若需严格区分类型,可结合 array_map()array_filter() 自定义逻辑,例如:

function strict_intersect($arr1, $arr2) {  
    return array_intersect($arr1, $arr2); // 此处需自行实现严格比较  
}  

2. 处理多维数组

当数组元素本身是数组时,array_intersect() 无法直接比较子数组的内容。此时可借助 array_udiff() 或自定义比较函数实现深度比较。

示例代码 4

$array1 = [[1, 2], [3, 4]];  
$array2 = [[3, 4], [5, 6]];  
// 默认返回空数组,因子数组被视为不同  
$result = array_intersect($array1, $array2);  
// 需通过其他方法(如序列化后比较)  

四、实际应用场景与案例分析

1. 用户权限管理

在权限系统中,常需判断用户拥有的权限是否与操作所需的权限完全匹配。

示例场景

$userPermissions = ["read", "write"];  
$requiredPermissions = ["read", "delete"];  
$common = array_intersect($userPermissions, $requiredPermissions);  
if (count($common) == count($requiredPermissions)) {  
    // 用户具备所有必要权限  
} else {  
    // 权限不足  
}  

2. 数据去重与合并

在数据清洗任务中,可利用 array_intersect() 筛选出多个数据源的共同记录。

示例代码 5

$source1 = ["A", "B", "C", "D"];  
$source2 = ["B", "C", "E", "F"];  
$source3 = ["C", "D", "G", "H"];  
$common = array_intersect($source1, $source2, $source3);  
// 结果:Array ( [2] => C )  

3. 订单匹配与业务逻辑

电商系统中,可比较用户购物车与库存商品,找出可立即购买的商品。

示例代码 6

$cart = ["商品ID1", "商品ID2", "商品ID3"];  
$stock = ["商品ID2", "商品ID3", "商品ID4"];  
$available = array_intersect($cart, $stock);  
// 用户可购买的有商品ID2和ID3  

五、注意事项与常见误区

1. 键名的影响

array_intersect() 仅保留 第一个数组的键名,即使其他数组存在相同值但键名不同。

示例代码 7

$array1 = ["a" => 100, "b" => 200];  
$array2 = [200, 300];  
$result = array_intersect($array1, $array2);  
// 输出:Array ( [b] => 200 )  

2. 性能优化

当处理 超大数据集 时,需注意 array_intersect() 的时间复杂度为 O(n²)。建议:

  • 提前过滤无关数据;
  • 使用 array_flip()in_array() 替代部分场景。

3. 与 array_diff() 的区别

array_diff() 返回的是 第一个数组中不同于其他数组的元素,而 array_intersect()共同元素

对比示例

$array1 = [1, 2, 3];  
$array2 = [2, 3, 4];  
// array_intersect 返回 [2,3]  
// array_diff 返回 [1]  

六、与相关函数的对比

1. array_intersect_key()

  • 功能:比较 键名 的交集,而非值。
  • 适用场景:需保留特定键名的元素。

2. array_uintersect()

  • 功能:通过自定义比较函数 callback 进行深度比较。
  • 示例
function compare($a, $b) {  
    return $a <=> $b; // 严格类型比较  
}  
$result = array_uintersect($array1, $array2, "compare");  

七、结论

PHP array_intersect() 函数通过简洁的语法和直观的逻辑,成为处理数组交集问题的首选工具。无论是基础的权限验证、数据清洗,还是复杂的业务匹配,该函数均能提供高效的解决方案。然而,开发者需注意其对键名的保留规则、类型敏感性限制,以及大规模数据的性能问题。通过结合实际案例与进阶技巧,开发者可充分挖掘这一函数的潜力,提升代码的健壮性与可维护性。

掌握 array_intersect() 的核心逻辑后,建议进一步探索 array_intersect_assoc()array_intersect_ukey() 等变体函数,以应对更复杂的数组操作需求。

最新发布