當前位置: 首頁> 最新文章列表> 基於array_diff_ukey() 實現鍵白名單邏輯

基於array_diff_ukey() 實現鍵白名單邏輯

M66 2025-05-14

在日常開發中,我們經常會遇到這樣的需求:從一個關聯數組中只保留指定的“鍵”,這通常被稱為“鍵白名單”邏輯。雖然我們可以使用array_intersect_key()來實現這個目標,但今天我們要介紹一種稍顯“冷門”但非常靈活的方式:使用array_diff_ukey()來實現鍵白名單。

什麼是array_diff_ukey()

array_diff_ukey()是PHP 提供的一個函數,用於比較兩個或多個數組的鍵名,並使用一個回調函數來決定鍵名是否相等。這個函數返回的是第一個數組中存在,但在其他數組中不存在的鍵值對

語法如下:

 array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array

實現思路

雖然array_diff_ukey()是用來“排除”鍵的,但我們可以通過一點“取巧”來將其反過來用於“保留”白名單鍵。原理如下:

  1. 構建一個包含白名單鍵的數組(可以是空值數組);

  2. 通過自定義的鍵比較函數反轉邏輯,使得只保留在白名單數組中的鍵;

  3. array_diff_ukey()從原始數組中“移除”不在白名單中的鍵。

示例代碼

以下是一個完整示例,假設我們有一個提交表單的數據數組$data ,我們只想保留鍵'username''email'

 <?php

// 模擬的用戶提交數據
$data = [
    'username' => 'john_doe',
    'email' => 'john@example.com',
    'password' => '123456',
    'redirect' => 'https://m66.net/welcome'
];

// 定義白名單鍵
$whitelistKeys = [
    'username' => true,
    'email' => true,
];

// array_diff_ukey 反向處理邏輯
$filteredData = array_diff_ukey($data, $whitelistKeys, function ($key1, $key2) {
    // 保留在白名單內的鍵
    return $key1 === $key2 ? 0 : -1;
});

// 從原數組中去掉那些“不屬於白名單”的鍵
$cleanData = array_diff_key($data, $filteredData);

// 輸出結果
print_r($cleanData);

/*
輸出結果:
Array
(
    [username] => john_doe
    [email] => john@example.com
)
*/
?>

優點分析

使用array_diff_ukey()實現鍵白名單的邏輯雖然稍微曲折,但它提供了:

  • 更強的靈活性:可以實現複雜的鍵匹配邏輯,比如忽略大小寫、處理前綴等;

  • 高可讀性(配合註釋使用時);

  • 無副作用:原始數組不會被修改。

應用場景

你可以將這種寫法封裝為一個工具函數,用於:

  • 過濾用戶提交的數據;

  • 保護系統配置的安全字段;

  • 控制接口響應結構的輸出內容。

小結

雖然PHP 提供了多種操作數組的方法,但靈活運用諸如array_diff_ukey()這類函數,可以讓我們用不同的方式實現常見的需求邏輯。如果你想打造一個更加健壯、可複用的數組過濾器,不妨試試看這樣的思路吧!