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
的共同元素是30
和40
,因此结果保留这两个值。- 注意:结果数组保留了
$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()
等变体函数,以应对更复杂的数组操作需求。