array_intersect()只比较值,不关心键名。array_intersect_assoc()不同——它要求键名和值都匹配,才会被保留到结果中。
这个函数从PHP 4.3.0开始可用。用于找出多个数组之间“一致”的键值对。
语法格式
array array_intersect_assoc(array $array1, array $array2 [, array $... ]): array
参数说明:
| 参数 | 说明 | 必填? |
|---|---|---|
| array1 | 基准数组,从中筛选 | 必填 |
| array2 | 第一个对比数组 | 必填 |
| array3... | 更多对比数组 | 可选 |
返回值: 返回一个数组,包含所有在array1中存在且在所有其他数组中也存在的键值对。
和array_intersect()的区别
| 函数 | 比较内容 | 条件 |
|---|---|---|
| array_intersect() | 只比较值 | 值在其他数组中出现就行 |
| array_intersect_assoc() | 键名+值 | 键名和值都必须在其他数组中存在 |
示例1:基础用法
<?php
$user_permissions_a = [
"view" => true,
"edit" => true,
"delete" => false,
"export" => true
];
$user_permissions_b = [
"view" => true,
"edit" => false,
"export" => true,
"share" => true
];
$common = array_intersect_assoc($user_permissions_a, $user_permissions_b);
print_r($common);
?>
输出:
Array
(
[view] => 1
[export] => 1
)
注意"edit"键名在两个数组里都存在,但值不同(true vs false),所以不包含。"view"和"export"两个条件键名相同、值也相同,所以被保留。
示例2:多个数组比较
<?php
$config_default = [
"host" => "localhost",
"port" => 3306,
"charset" => "utf8",
"debug" => false
];
$config_local = [
"host" => "localhost",
"port" => 3307,
"charset" => "utf8",
"debug" => true
];
$config_prod = [
"host" => "db.example.com",
"port" => 3306,
"charset" => "utf8",
"debug" => false
];
$common_all = array_intersect_assoc($config_default, $config_local, $config_prod);
print_r($common_all);
?>
输出:
Array
(
[charset] => utf8
)
只有charset => utf8这个键值对在三个配置中都存在。其他项至少有一个配置不同。
示例3:索引数组的
<?php
$arr1 = ["苹果", "香蕉", "橙子", "葡萄"];
$arr2 = ["香蕉", "苹果", "葡萄", "橙子"];
$intersect = array_intersect_assoc($arr1, $arr2);
print_r($intersect);
?>
输出:
Array
(
)
结果是空数组!因为索引数组的键名是数字下标:
-
arr1[0]="苹果",arr2[0]="香蕉" → 不匹配
-
arr1[1]="香蕉",arr2[1]="苹果" → 不匹配
-
以此类推...
虽然值都存在,但位置(键名)不同。如果想按值比较不管位置,用array_intersect()。
个人经验分享
-
什么时候用array_intersect_assoc?
-
需要精确匹配键值对,比如配置对比、权限验证
-
数据同步时找出相同的记录(ID和内容都一致)
-
两个关联数组找“状态没有变化”的项
-
-
和array_diff_assoc()是反操作
-
array_intersect_assoc():找共同存在的 -
array_diff_assoc():找只在第一个中存在的
两者搭配可以完整分析两个数组的差异。
-
-
性能方面
array_intersect_assoc()比array_intersect()稍慢,因为还要比较键名。但差别不大,大数据量下区别才明显。 -
常见应用场景:数据对账
// 对比两个系统的用户数据,找出匹配的记录 $unchanged = array_intersect_assoc($old_data, $new_data); $changed = array_diff_assoc($new_data, $old_data); $deleted = array_diff_assoc($old_data, $new_data);
示例4:代码号学习编程场景
<?php
// 场景:学期初末成绩对比,找出成绩没变化的学生科目
$midterm = [
"code001" => ["math" => 85, "english" => 78, "php" => 92],
"code002" => ["math" => 90, "english" => 88, "php" => 85],
"code003" => ["math" => 75, "english" => 80, "php" => 88]
];
$final = [
"code001" => ["math" => 85, "english" => 82, "php" => 92],
"code002" => ["math" => 90, "english" => 88, "php" => 90],
"code003" => ["math" => 78, "english" => 80, "php" => 88]
];
// 找出成绩没变的记录(键名和值都相同)
function find_unchanged_scores($old, $new) {
$unchanged = [];
foreach ($old as $student => $scores) {
if (isset($new[$student])) {
$common = array_intersect_assoc($scores, $new[$student]);
if (!empty($common)) {
$unchanged[$student] = $common;
}
}
}
return $unchanged;
}
$result = find_unchanged_scores($midterm, $final);
print_r($result);
?>
输出:
Array
(
[code001] => Array
(
[math] => 85
[php] => 92
)
[code003] => Array
(
[english] => 80
[php] => 88
)
)
示例5:严格对比配置差异
<?php
$old_config = [
"app_name" => "学习平台",
"version" => "2.0",
"debug" => true,
"cache_enabled" => false,
"max_users" => 100
];
$new_config = [
"app_name" => "学习平台",
"version" => "2.1",
"debug" => false,
"cache_enabled" => false,
"max_users" => 100
];
// 找出配置项没有变化的
$unchanged = array_intersect_assoc($old_config, $new_config);
// 找出配置项有变化的
$changed = array_diff_assoc($new_config, $old_config);
echo "没有变化的配置项:\n";
print_r($unchanged);
echo "\n有变化的配置项:\n";
print_r($changed);
?>
输出:
没有变化的配置项:
Array
(
[app_name] => 学习平台
[cache_enabled] =>
[max_users] => 100
)
有变化的配置项:
Array
(
[version] => 2.1
[debug] =>
)
示例6:处理数值型键名
<?php
$team_a = [
101 => "张伟",
102 => "李芳",
103 => "王磊"
];
$team_b = [
101 => "张伟",
103 => "王磊",
104 => "赵敏"
];
$common_members = array_intersect_assoc($team_a, $team_b);
print_r($common_members);
?>
输出:
Array
(
[101] => 张伟
[103] => 王磊
)
数值键名的匹配规则和字符串键名一样:键名和值都必须相同。
本节课程知识要点
-
array_intersect_assoc()返回键名和值都匹配的元素 -
至少需要两个数组,可以传入更多
-
和
array_intersect()的区别:后者只比较值 -
和
array_diff_assoc()功能相反(一个找交集,一个找差集) -
索引数组使用时要注意:键名(位置)也必须相同
-
返回的数组保留原数组的键名
-
从PHP 4.3.0开始可用