在日常開發中,我們經常會遇到這樣的需求:從一個關聯數組中只保留指定的“鍵”,這通常被稱為“鍵白名單”邏輯。雖然我們可以使用array_intersect_key()來實現這個目標,但今天我們要介紹一種稍顯“冷門”但非常靈活的方式:使用array_diff_ukey()來實現鍵白名單。
array_diff_ukey()是PHP 提供的一個函數,用於比較兩個或多個數組的鍵名,並使用一個回調函數來決定鍵名是否相等。這個函數返回的是第一個數組中存在,但在其他數組中不存在的鍵值對。
語法如下:
array_diff_ukey(array $array1, array $array2, callable $key_compare_func): array
雖然array_diff_ukey()是用來“排除”鍵的,但我們可以通過一點“取巧”來將其反過來用於“保留”白名單鍵。原理如下:
構建一個包含白名單鍵的數組(可以是空值數組);
通過自定義的鍵比較函數反轉邏輯,使得只保留在白名單數組中的鍵;
用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()這類函數,可以讓我們用不同的方式實現常見的需求邏輯。如果你想打造一個更加健壯、可複用的數組過濾器,不妨試試看這樣的思路吧!