在日常的 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() 或自定义递归函数处理。