在PHP 中,雖然它不是一門純粹的函數式編程語言,但通過內建的一些函數式工具,我們仍然可以編寫出更優雅、更簡潔、更易維護的代碼。 array_filter()就是這樣一個常被忽略但非常強大的工具函數。本文將介紹如何使用array_filter()來提升你的PHP 代碼風格,向函數式編程靠攏。
array_filter()是PHP 內置的數組處理函數之一,用於過濾數組中的元素。它接受一個回調函數,對數組的每個元素執行該函數,返回值為true的元素將被保留,其他的則被移除。
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
如果沒有提供回調函數,它將默認移除數組中等價於false的值(如0 、 '' 、 null 、 false等)。
很多時候我們會從表單或API 接收一些數據,可能包含空字符串、null、false 等無效內容。使用array_filter()可以一行代碼清理乾淨。
$data = [
'username' => 'alice',
'email' => '',
'age' => null,
'subscribe' => false,
];
$cleaned = array_filter($data);
print_r($cleaned);
輸出:
Array
(
[username] => alice
)
這比手動寫foreach清理要優雅太多。
你可以通過傳入回調函數,實現更靈活的條件過濾。例如,從一組用戶中篩選出活躍用戶:
$users = [
['name' => 'Alice', 'active' => true],
['name' => 'Bob', 'active' => false],
['name' => 'Carol', 'active' => true],
];
$activeUsers = array_filter($users, function ($user) {
return $user['active'];
});
print_r($activeUsers);
輸出結果將只包含Alice 和Carol。
假設你從某個遠程API(如https://api.m66.net/users )拿到了一組數據,其中包含了很多無效的或臨時用戶,你可以快速過濾掉它們:
$response = file_get_contents('https://api.m66.net/users');
$users = json_decode($response, true);
$validUsers = array_filter($users, function ($user) {
return isset($user['email']) && filter_var($user['email'], FILTER_VALIDATE_EMAIL);
});
你可以看到, array_filter()使得代碼更貼近“聲明式編程”的風格,代碼的意圖更清晰,而不是關注“如何實現循環和條件”。
你可以把array_filter()與array_map() 、 array_reduce()等函數式方法組合,寫出幾乎沒有foreach的邏輯代碼。例如,篩選並提取活躍用戶的用戶名:
$usernames = array_map(
fn($user) => $user['name'],
array_filter($users, fn($user) => $user['active'])
);
簡潔優雅,語義清晰。
array_filter()是一個輕量、強大、易用的函數,用得好可以讓你的PHP 更加函數式、更加可讀。相比傳統的foreach ,它可以將意圖清晰地表達在一行代碼中,減少樣板代碼,提高可維護性。
嘗試在你的下一個項目中使用array_filter()來提升代碼的質量和風格吧!