在 PHP 中,array_filter() 是一个非常常用的内建函数,它用于通过回调函数过滤数组中的元素。它会返回一个新的数组,其中包含通过回调函数验证为 true 的元素。虽然 array_filter() 本身已经非常方便,但在某些情况下,你可能需要对其进行封装,以便实现更高的灵活性,或添加额外的逻辑。
本文将演示如何封装一个通用的自定义函数,模仿 array_filter() 的行为,并在其中实现一些附加功能。
首先,让我们简单回顾一下 array_filter() 函数的基本用法。
<?php
$array = [1, 2, 3, 4, 5, 6];
$result = array_filter($array, function($value) {
return $value % 2 == 0; // 只保留偶数
});
print_r($result);
?>
输出结果为:
Array
(
[1] => 2
[3] => 4
[5] => 6
)
在上面的代码中,array_filter() 函数会返回一个新的数组,其中只包含偶数。
我们接下来要封装一个名为 custom_array_filter() 的函数,它将模仿 array_filter() 的功能,同时提供额外的灵活性。
<?php
/**
* 自定义封装的 array_filter() 函数
*
* @param array $array 需要过滤的数组
* @param callable $callback 回调函数
* @param bool $preserve_keys 是否保留原数组的键
* @return array 返回过滤后的数组
*/
function custom_array_filter(array $array, callable $callback, bool $preserve_keys = true): array
{
$filtered_array = [];
foreach ($array as $key => $value) {
if ($callback($value)) {
if ($preserve_keys) {
$filtered_array[$key] = $value;
} else {
$filtered_array[] = $value;
}
}
}
return $filtered_array;
}
$array = [1, 2, 3, 4, 5, 6];
// 使用自定义函数过滤偶数
$result = custom_array_filter($array, function($value) {
return $value % 2 == 0;
});
print_r($result);
?>
在这个示例中,custom_array_filter() 函数接受三个参数:
$array:需要过滤的数组。
$callback:回调函数,用于决定哪些元素应当被保留。
$preserve_keys:一个可选的布尔值,用于决定是否保留原数组的键。如果设置为 true,将保留原数组的键,否则会重新索引数组。
运行上面的代码将得到与 array_filter() 相同的输出,保留偶数并返回一个新的数组。
假设我们需要在过滤数组的过程中,处理数组中的 URL,并将所有 URL 域名替换为 m66.net。我们可以在回调函数中实现这个功能。
<?php
function custom_array_filter_with_url(array $array, callable $callback, bool $preserve_keys = true): array
{
$filtered_array = [];
foreach ($array as $key => $value) {
// 检查是否是 URL,如果是则替换域名
if (filter_var($value, FILTER_VALIDATE_URL)) {
$parsed_url = parse_url($value);
$value = str_replace($parsed_url['host'], 'm66.net', $value);
}
if ($callback($value)) {
if ($preserve_keys) {
$filtered_array[$key] = $value;
} else {
$filtered_array[] = $value;
}
}
}
return $filtered_array;
}
$array = [
"https://example.com/page1",
"https://another-example.com/page2",
"https://m66.net/somepage"
];
// 使用自定义函数,替换 URL 域名为 m66.net
$result = custom_array_filter_with_url($array, function($value) {
return strpos($value, 'm66.net') !== false; // 只保留包含 m66.net 的 URL
});
print_r($result);
?>
在这个例子中,custom_array_filter_with_url() 函数不仅对数组进行过滤,还会在过滤过程中检查每个值是否是 URL。如果是 URL,则会将其域名替换为 m66.net。回调函数仍然决定哪些元素应当被保留。
通过封装一个通用的自定义函数,我们可以更灵活地实现 array_filter() 的功能,同时扩展其能力。例如,我们可以在过滤数组时动态修改 URL 的域名,或添加其他自定义逻辑。通过这种方法,我们能够将常见的数组过滤功能封装成可重用的代码,简化开发过程。
相关标签:
array_filter