當前位置: 首頁> 最新文章列表> 用array_flip() 和array_intersect_key() 做數組過濾

用array_flip() 和array_intersect_key() 做數組過濾

M66 2025-05-14

在日常PHP 開發中,我們經常需要根據某些“白名單鍵”或“黑名單鍵”來過濾數組。 PHP 提供的array_flip()array_intersect_key()函數可以非常高效地實現這一需求。本文將通過具體的代碼示例,介紹如何使用這兩個函數來完成數組過濾的任務。

一、函數簡介

1. array_flip()

該函數用於交換數組中的鍵和值。

 array_flip(array $array): array
  • 輸入:一個數組。

  • 輸出:鍵值對翻轉後的數組(注意:原數組的值必須是唯一且可作為鍵的標量值)。

2. array_intersect_key()

該函數用於返回數組中所有鍵在另一個數組中也存在的元素。

 array_intersect_key(array $array, array ...$arrays): array
  • 輸入:兩個或多個數組。

  • 輸出:只保留第一個數組中,鍵同時出現在後面所有數組中的元素。

二、使用場景舉例

過濾用戶輸入字段,只保留允許的鍵

假設我們從用戶表單接收如下數據:

 $userInput = [
    'username' => 'john_doe',
    'password' => '123456',
    'email' => 'john@example.com',
    'token' => 'abcd1234',  // 非法字段
];

我們只希望保留'username''password''email'這三個字段,其他的都應該過濾掉。

使用array_flip() + array_intersect_key()實現過濾:

 $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 參數

假設你開發了一個API 接口,接收到如下URL 參數:

 https://m66.net/api/user/update?username=jane&password=78910&is_admin=1

你不希望客戶端可以隨意修改is_admin這類敏感字段,只允許更新usernamepassword

你可以這樣做:

 $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));
}

如此一來,你的代碼將更加模塊化和可讀性強。