當前位置: 首頁> 最新文章列表> 用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()或自定義遞歸函數處理。