array_intersect_ukey(array $array1, array $array2, callable $key_compare_func): array
此函数返回一个数组,该数组包含了 $array1 中所有键也存在于 $array2 中的元素,键的比较方式由 key_compare_func 决定。
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' 的内容,并丢弃其他字段。
$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]
)
array_flip($logFields) 将我们需要的键名数组翻转为键名是字段名、值为索引的数组,这样就可以用作 array_intersect_ukey 的比较对象。
使用 strcmp 作为比较函数,实现标准的字符串比较。
最终结果即为 $apiData 中键存在于 $logFields 的字段集合。
假设我们处理的是一组带有 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_flip 和 array_intersect_ukey 将数据筛选出来。
这种方式让我们可以根据值中的某些逻辑来保留数组中对应的键,从而进行非常灵活的结构化数据处理。