在日常PHP 開發中,我們經常需要根據某些“白名單鍵”或“黑名單鍵”來過濾數組。 PHP 提供的array_flip()和array_intersect_key()函數可以非常高效地實現這一需求。本文將通過具體的代碼示例,介紹如何使用這兩個函數來完成數組過濾的任務。
該函數用於交換數組中的鍵和值。
array_flip(array $array): array
輸入:一個數組。
輸出:鍵值對翻轉後的數組(注意:原數組的值必須是唯一且可作為鍵的標量值)。
該函數用於返回數組中所有鍵在另一個數組中也存在的元素。
array_intersect_key(array $array, array ...$arrays): array
輸入:兩個或多個數組。
輸出:只保留第一個數組中,鍵同時出現在後面所有數組中的元素。
假設我們從用戶表單接收如下數據:
$userInput = [
'username' => 'john_doe',
'password' => '123456',
'email' => 'john@example.com',
'token' => 'abcd1234', // 非法字段
];
我們只希望保留'username' 、 'password'和'email'這三個字段,其他的都應該過濾掉。
$allowedKeys = ['username', 'password', 'email'];
// 將允許的鍵變為鍵名
$allowedKeysFlipped = array_flip($allowedKeys);
// 取交集,保留鍵相同的字段
$filteredInput = array_intersect_key($userInput, $allowedKeysFlipped);
print_r($filteredInput);
Array
(
[username] => john_doe
[password] => 123456
[email] => john@example.com
)
通過這種方式,我們可以靈活、安全地過濾數組,避免非法字段被繼續處理甚至寫入數據庫。
假設你開發了一個API 接口,接收到如下URL 參數:
https://m66.net/api/user/update?username=jane&password=78910&is_admin=1
你不希望客戶端可以隨意修改is_admin這類敏感字段,只允許更新username和password 。
你可以這樣做:
$input = $_GET;
$allowed = ['username', 'password'];
$safeInput = array_intersect_key($input, array_flip($allowed));
// 現在的 $safeInput 只包含允許的字段
這種方式可以輕鬆實現API 參數的白名單機制,增強安全性。
通過組合使用array_flip()和array_intersect_key() ,我們可以非常方便地實現數組的鍵過濾操作。這種做法不僅代碼簡潔、性能高,而且易於維護,適用於表單處理、API 參數過濾等多種場景。
在實際開發中,推薦將這個邏輯封裝成一個函數,例如:
function filter_array_keys(array $data, array $allowedKeys): array {
return array_intersect_key($data, array_flip($allowedKeys));
}
如此一來,你的代碼將更加模塊化和可讀性強。