當前位置: 首頁> 最新文章列表> 如何封裝一個通用的自定義函數來實現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 的域名,或添加其他自定義邏輯。通過這種方法,我們能夠將常見的數組過濾功能封裝成可重用的代碼,簡化開發過程。