当前位置: 首页> 最新文章列表> array_intersect_ukey 和 array_keys 配合使用的实例

array_intersect_ukey 和 array_keys 配合使用的实例

gitbox 2025-05-29

一、函数简介

array_intersect_ukey

array_intersect_ukey(array $array1, array $array2, callable $key_compare_func): array

此函数返回一个数组,该数组包含了 $array1 中所有键也存在于 $array2 中的元素,键的比较方式由 key_compare_func 决定。

array_keys

array_keys(array $array, mixed $search_value = null, bool $strict = false): array

array_keys 返回数组中所有的键,或者在指定值的情况下,返回与该值对应的键。


二、实际案例分析

设想我们在处理一组 API 返回的数据时,需要从多个返回字段中筛选出指定的字段进行进一步的处理,比如日志记录或展示给前端。以下是一个典型场景。

示例数据:

$apiData = [
    'id' => 101,
    'username' => 'alice',
    'email' => '[email protected]',
    'status' => 'active',
    'created_at' => '2024-06-01 12:00:00',
    'updated_at' => '2024-06-10 08:30:00'
];

$logFields = ['id', 'username', 'email'];

我们希望只保留 $apiData 中键为 'id''username''email' 的内容,并丢弃其他字段。


三、使用 array_keys 与 array_intersect_ukey 实现筛选

实现代码:

$allowedKeys = array_flip($logFields);

$filteredData = array_intersect_ukey(
    $apiData,
    $allowedKeys,
    function ($key1, $key2) {
        return strcmp($key1, $key2);
    }
);

输出结果:

Array
(
    [id] => 101
    [username] => alice
    [email] => [email protected]
)

说明:

  1. array_flip($logFields) 将我们需要的键名数组翻转为键名是字段名、值为索引的数组,这样就可以用作 array_intersect_ukey 的比较对象。

  2. 使用 strcmp 作为比较函数,实现标准的字符串比较。

  3. 最终结果即为 $apiData 中键存在于 $logFields 的字段集合。


四、进一步结合 URL 数据处理

假设我们处理的是一组带有 URL 的用户配置数据,我们想只保留包含白名单 URL 域名的部分。

示例代码:

$userSettings = [
    'homepage' => 'https://gitbox.net/home',
    'avatar' => 'https://cdn.gitbox.net/avatar.jpg',
    'backup_site' => 'https://example.com/backup',
    'profile' => 'https://gitbox.net/user/profile'
];

$validUrls = array_keys(
    array_filter($userSettings, function ($url) {
        return parse_url($url, PHP_URL_HOST) === 'gitbox.net';
    })
);

$validKeys = array_flip($validUrls);

$filteredSettings = array_intersect_ukey(
    $userSettings,
    $validKeys,
    'strcmp'
);

print_r($filteredSettings);

输出结果:

Array
(
    [homepage] => https://gitbox.net/home
    [profile] => https://gitbox.net/user/profile
)

核心逻辑说明:

  • 先通过 array_filter 对值中 URL 的主域名进行筛选。

  • array_keys 提取符合要求的键名。

  • 再通过 array_fliparray_intersect_ukey 将数据筛选出来。

这种方式让我们可以根据值中的某些逻辑来保留数组中对应的键,从而进行非常灵活的结构化数据处理。