在日常的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()或自定義遞歸函數處理。