← PHP中的in_array():检查数组中是否存在某个值 PHP中的array_intersect():计算数组的交集 →

PHP中的array_intersect_assoc():带键名检查的数组交集

原创 2026-05-22 PHP 已有人查阅

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()

个人经验分享

  1. 什么时候用array_intersect_assoc?

    • 需要精确匹配键值对,比如配置对比、权限验证

    • 数据同步时找出相同的记录(ID和内容都一致)

    • 两个关联数组找“状态没有变化”的项

  2. 和array_diff_assoc()是反操作

    • array_intersect_assoc():找共同存在的

    • array_diff_assoc():找只在第一个中存在的
      两者搭配可以完整分析两个数组的差异。

  3. 性能方面
    array_intersect_assoc()array_intersect()稍慢,因为还要比较键名。但差别不大,大数据量下区别才明显。

  4. 常见应用场景:数据对账

    // 对比两个系统的用户数据,找出匹配的记录
    $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开始可用

← PHP中的in_array():检查数组中是否存在某个值 PHP中的array_intersect():计算数组的交集 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号