当前位置: 首页> 最新文章列表> 用 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));
}

如此一来,你的代码将更加模块化和可读性强。