当前位置: 首页> 最新文章列表> 用 array_diff_ukey() 比较多维数组的顶级键

用 array_diff_ukey() 比较多维数组的顶级键

M66 2025-05-14

在日常的 PHP 开发中,我们经常会遇到需要比较数组之间差异的情况。对于多维数组而言,如果我们只关心**顶级键(一级键)**的差异,而不比较其值,array_diff_ukey() 是一个非常实用的工具。

本文将介绍如何使用 array_diff_ukey() 来比较两个多维数组的顶级键,并找出不同的部分。

一、函数简介

array_diff_ukey() 用于根据用户提供的回调函数来比较键名,从而找出两个或多个数组中键名不重复的部分。

语法:

array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
  • $array1:需要被比较的数组。

  • $array2:用来与第一个数组进行比较的数组。

  • $key_compare_func:一个用户自定义的键比较函数。

二、应用场景说明

假设你有两个多维数组,分别表示两个不同的配置集合。你想找出在主配置中存在、但在对比配置中不存在的顶级键(一级键)。

$configMain = [
    'database' => [
        'host' => 'localhost',
        'port' => 3306
    ],
    'cache' => [
        'enabled' => true
    ],
    'api' => [
        'endpoint' => 'https://m66.net/api'
    ]
];

$configCompare = [
    'database' => [
        'host' => '127.0.0.1',
        'port' => 3306
    ],
    'cache' => [
        'enabled' => false
    ]
];

我们想找出 $configMain 中有哪些顶级键在 $configCompare 中没有出现(比如上例中的 api 键)。

三、实现代码

<?php

function compareKeys($a, $b) {
    if ($a === $b) {
        return 0;
    }
    return ($a > $b) ? 1 : -1;
}

$configMain = [
    'database' => [
        'host' => 'localhost',
        'port' => 3306
    ],
    'cache' => [
        'enabled' => true
    ],
    'api' => [
        'endpoint' => 'https://m66.net/api'
    ]
];

$configCompare = [
    'database' => [
        'host' => '127.0.0.1',
        'port' => 3306
    ],
    'cache' => [
        'enabled' => false
    ]
];

$diffKeys = array_diff_ukey($configMain, $configCompare, 'compareKeys');

print_r($diffKeys);

四、输出结果

Array
(
    [api] => Array
        (
            [endpoint] => https://m66.net/api
        )
)

如你所见,array_diff_ukey() 成功找出了 $configMain 中存在但 $configCompare 中没有的顶级键 api

五、注意事项

  • 回调函数必须是比较两个键的函数,返回值规则与 strcmp() 一样:小于 0、等于 0、大于 0。

  • 该函数不比较值,仅比较键。

  • 仅对顶级键有效,如果要比较嵌套结构,请使用递归逻辑配合。

六、总结

使用 array_diff_ukey() 是一种高效且简洁的方法来比较两个数组之间的键名差异,尤其适用于多维数组中只关心一级结构差异的场景。

无论是在处理配置差异、结构对比,还是进行权限校验中,掌握这个函数的用法都能让你写出更干净、逻辑更清晰的 PHP 代码。

如果你想进一步比较键值对的差异,可以考虑搭配使用 array_diff_assoc() 或自定义递归函数处理。