PHP array_diff() 和 array_intersect() 详解:数组集合运算
- 2026年7月3日
- 198 次
前言
做数据对比时经常需要找出两个数组的差集和交集。array_diff() 和 array_intersect() 就是干这个的。这篇文章把它们和 array_merge() 的区别理清楚。
array_diff() 差集
array_diff(array1, array2, ...) - 返回在 array1 中但不在其他数组中的值。注意:只比较值,不比较键名。
<?php
$original = [1, 2, 3, 4, 5];
$removed = [2, 4];
$result = array_diff($original, $removed);
print_r($result);
// Array ( [0] => 1 [2] => 3 [4] => 5 )
?>
多维数组差集
array_diff_assoc() 比较值和键名,array_diff_uassoc() 用自定义函数比较键名。
<?php
$a = [0 => 'one', 1 => 'two'];
$b = [0 => 'one'];
print_r(array_diff($a, $b));
// Array ( [1] => two )
print_r(array_diff_assoc($a, $b));
// Array ( [1] => two ) 键名和值都不同才算
?>
array_intersect() 交集
array_intersect(array1, array2, ...) - 返回两个数组都有的值。同样只比较值。
<?php
$allowed = ['admin', 'editor', 'author'];
$currentUser = ['editor', 'contributor'];
$permissions = array_intersect($allowed, $currentUser);
print_r($permissions);
// Array ( [0] => editor )
?>
集合运算对比
| 函数 | 功能 | 比较 |
|---|---|---|
| array_diff() | 差集 | 只比较值 |
| array_diff_assoc() | 差集 | 比较值和键名 |
| array_intersect() | 交集 | 只比较值 |
| array_intersect_assoc() | 交集 | 比较值和键名 |
实战场景
场景1:权限对比
<?php
$rolePermissions = ['read', 'write', 'delete'];
$userPermissions = ['read', 'write'];
$canDelete = array_diff($rolePermissions, $userPermissions);
if (!empty($canDelete)) {
echo '缺少权限: ' . implode(', ', $canDelete);
}
?>
场景2:数据同步
<?php
// 找出需要新增和删除的记录
$localIds = [1, 2, 3, 4, 5];
$serverIds = [3, 4, 5, 6, 7];
$toAdd = array_diff($serverIds, $localIds); // 需要新增
$toRemove = array_diff($localIds, $serverIds); // 需要删除
$toKeep = array_intersect($localIds, $serverIds); // 保持同步
?>
踩坑提醒
- array_diff() 只比较值,不比较键名,键名保留在原数组的位置
- 字符串比较是区分大小写的,'A' 和 'a' 是不同的
- array_diff_assoc() 同时比较值和键名
- array_diff_uassoc() 可以用自定义函数比较键名
总结
- array_diff() 返回差集,array_intersect() 返回交集
- 只比较值,不比较键名
- 需要同时比较键名时用 *_assoc 版本
- 权限对比、数据同步、去重等场景常用
<?php
$rolePermissions = ['read', 'write', 'delete'];
$userPermissions = ['read', 'write'];
$canDelete = array_diff($rolePermissions, $userPermissions);
if (!empty($canDelete)) {
echo '缺少权限: ' . implode(', ', $canDelete);
}
?>
<?php
// 找出需要新增和删除的记录
$localIds = [1, 2, 3, 4, 5];
$serverIds = [3, 4, 5, 6, 7];
$toAdd = array_diff($serverIds, $localIds); // 需要新增
$toRemove = array_diff($localIds, $serverIds); // 需要删除
$toKeep = array_intersect($localIds, $serverIds); // 保持同步
?>
踩坑提醒
- array_diff() 只比较值,不比较键名,键名保留在原数组的位置
- 字符串比较是区分大小写的,'A' 和 'a' 是不同的
- array_diff_assoc() 同时比较值和键名
- array_diff_uassoc() 可以用自定义函数比较键名
总结
- array_diff() 返回差集,array_intersect() 返回交集
- 只比较值,不比较键名
- 需要同时比较键名时用 *_assoc 版本
- 权限对比、数据同步、去重等场景常用
若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。
- html文本框的基本语法 Html文本框如何使用? 2022-06-22
- 实现php关联数组的增删改查学习笔记 2021-04-12
- 五种将将.jfif后缀格式的图片转化为.jpeg、jpg格式图片的方法 2023-02-13
- PHP文件的时间函数有哪些?PHP文件时间函数实例 2022-11-13
- PHP数据类型转换:字符串数据类型强制转换为整数数据类型 2022-06-10
- PHP构造方法使用学习笔记 PHP构造方法实例代码 2022-12-03
