当前位置: 首页> 最新文章列表> 如何封装一个通用的自定义函数来实现 PHP 的 array_filter() 逻辑?

如何封装一个通用的自定义函数来实现 PHP 的 array_filter() 逻辑?

M66 2025-06-15

在 PHP 中,array_filter() 是一个非常常用的内建函数,它用于通过回调函数过滤数组中的元素。它会返回一个新的数组,其中包含通过回调函数验证为 true 的元素。虽然 array_filter() 本身已经非常方便,但在某些情况下,你可能需要对其进行封装,以便实现更高的灵活性,或添加额外的逻辑。

本文将演示如何封装一个通用的自定义函数,模仿 array_filter() 的行为,并在其中实现一些附加功能。

1. 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() 函数会返回一个新的数组,其中只包含偶数。

2. 自定义封装函数实现

我们接下来要封装一个名为 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() 函数接受三个参数:

  1. $array:需要过滤的数组。

  2. $callback:回调函数,用于决定哪些元素应当被保留。

  3. $preserve_keys:一个可选的布尔值,用于决定是否保留原数组的键。如果设置为 true,将保留原数组的键,否则会重新索引数组。

运行上面的代码将得到与 array_filter() 相同的输出,保留偶数并返回一个新的数组。

3. 实现 URL 替换功能

假设我们需要在过滤数组的过程中,处理数组中的 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。回调函数仍然决定哪些元素应当被保留。

4. 总结

通过封装一个通用的自定义函数,我们可以更灵活地实现 array_filter() 的功能,同时扩展其能力。例如,我们可以在过滤数组时动态修改 URL 的域名,或添加其他自定义逻辑。通过这种方法,我们能够将常见的数组过滤功能封装成可重用的代码,简化开发过程。