在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