在日常 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));
}
如此一来,你的代码将更加模块化和可读性强。