李涛自留地
回到顶部
首页 > php学习 > PHP array_diff() 和 array_intersect() 详解:数组集合运算

PHP array_diff() 和 array_intersect() 详解:数组集合运算

文章目录

前言

做数据对比时经常需要找出两个数组的差集和交集。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);  // 保持同步
?>

踩坑提醒

  1. array_diff() 只比较值,不比较键名,键名保留在原数组的位置
  2. 字符串比较是区分大小写的,'A' 和 'a' 是不同的
  3. array_diff_assoc() 同时比较值和键名
  4. array_diff_uassoc() 可以用自定义函数比较键名

总结

  1. array_diff() 返回差集,array_intersect() 返回交集
  2. 只比较值,不比较键名
  3. 需要同时比较键名时用 *_assoc 版本
  4. 权限对比、数据同步、去重等场景常用

若非作者标注皆为李涛自留地原创文章,转载或复制请以超链接形式并注明出处。