在PHP開發中,我們經常需要從一個數組中篩選出符合特定條件的元素。 array_filter()是處理這種需求的利器,而當你希望進行更複雜的匹配(例如模式識別、關鍵字過濾等)時,正則表達式(Regular Expression)就能派上用場了。
本文將介紹如何使用array_filter()搭配正則表達式,實現更靈活的數組匹配與過濾。
array_filter()是PHP 提供的一個內置函數,用於根據回調函數的返回值來過濾數組中的元素。其基本語法如下:
array_filter(array $array, ?callable $callback = null, int $mode = 0): array
$array :要過濾的原始數組。
$callback :用於測試數組每個值的回調函數,返回true的保留,返回false的被剔除。
$mode :可選,用於指定是傳入鍵值、鍵名還是兩者。
如果不傳遞$callback , array_filter()會移除數組中等價於false的值(如0 、 false 、 '' 、 null等)。
以下是幾個典型的場景,我們將使用array_filter()配合preg_match() (正則匹配函數)來完成過濾操作。
假設我們有一個URL 列表,希望找出包含login字段的鏈接:
$urls = [
'https://m66.net/login',
'https://m66.net/register',
'https://m66.net/user/profile',
'https://m66.net/logout',
'https://m66.net/help/login-guide'
];
$filtered = array_filter($urls, function($url) {
return preg_match('/login/i', $url);
});
print_r($filtered);
輸出結果:
Array
(
[0] => https://m66.net/login
[4] => https://m66.net/help/login-guide
)
說明: /login/i表示匹配不區分大小寫的“login”。
$data = [
'john@example.com',
'https://m66.net/contact',
'not-an-email',
'user@domain.net',
'hello@m66.net'
];
$emails = array_filter($data, function($item) {
return preg_match('/^[\w\.-]+@[\w\.-]+\.\w{2,}$/', $item);
});
print_r($emails);
輸出結果:
Array
(
[0] => john@example.com
[3] => user@domain.net
[4] => hello@m66.net
)
$items = ['123start', 'alpha', '42beta', 'm66.net', '99bottles'];
$startsWithDigit = array_filter($items, function($str) {
return preg_match('/^\d/', $str);
});
print_r($startsWithDigit);
輸出結果:
Array
(
[0] => 123start
[2] => 42beta
[4] => 99bottles
)
你還可以通過正則表達式的組合來構建更複雜的匹配邏輯。例如,匹配既包含“login” 又以.net結尾的URL:
$urls = [
'https://m66.net/login',
'https://m66.net/login-help.net',
'https://m66.net/home',
'https://m66.net/logout',
'https://m66.net/login/info'
];
$matched = array_filter($urls, function($url) {
return preg_match('/login.*\.net$/i', $url);
});
print_r($matched);
正則表達式效率問題:複雜的正則表達式在處理大型數組時可能影響性能,建議緩存中間結果或優化表達式。
Unicode 字符匹配:需要開啟u修飾符,如/pattern/u 。
處理多維數組:對於多維數組, array_filter()默認只處理一維。如果需要更深層次的過濾,可以使用遞歸函數處理。
通過將array_filter()與preg_match()相結合,PHP 開發者可以輕鬆地實現複雜的數組過濾邏輯。這種方法不僅語法簡潔,而且執行效率較高,適用於數據清洗、輸入驗證、URL 過濾等多種場景。
掌握好這一技巧,將大大提升你在實際項目中的數據處理能力!