在PHP中, array_filter和array_map是兩個非常常用且強大的數組處理函數。它們單獨使用時各有妙用,但當我們將它們組合起來使用,能夠極大地提升代碼的簡潔性和效率。本文將詳細介紹這兩個函數的用法,並分享它們組合使用的實用技巧和最佳實踐。
array_filter
該函數用於過濾數組元素。通過一個回調函數判斷每個元素是否滿足條件,返回所有滿足條件的元素組成的新數組。
$filtered = array_filter($array, function($item) {
return $item > 10; // 過濾大於10的元素
});
array_map
該函數用於對數組的每個元素執行相同的回調操作,返回處理後的新數組。
$mapped = array_map(function($item) {
return $item * 2; // 將每個元素乘以2
}, $array);
過濾後再映射:先用array_filter篩選出符合條件的元素,再用array_map對這些元素進行統一處理。
映射後再過濾:先用array_map轉換數組元素格式,再用array_filter篩選符合要求的結果。
一次鍊式操作:組合使用可以寫出簡潔、直觀的鍊式代碼,避免寫冗長的循環。
<?php
$numbers = [1, 5, 12, 18, 7, 25];
// 先過濾出大於10的數字
$filtered = array_filter($numbers, function($num) {
return $num > 10;
});
// 再对过滤后的數字做平方操作
$squared = array_map(function($num) {
return $num * $num;
}, $filtered);
print_r($squared);
?>
輸出:
Array
(
[2] => 144
[3] => 324
[5] => 625
)
這個例子中,先用array_filter剔除掉不符合條件的元素,避免array_map做無用功。
PHP 7.4+ 支持箭頭函數,配合鍊式調用更簡潔:
<?php
$numbers = [1, 5, 12, 18, 7, 25];
$result = array_map(
fn($num) => $num * $num,
array_filter($numbers, fn($num) => $num > 10)
);
print_r($result);
?>
<?php
$urls = [
'http://example.com',
'ftp://fileserver.com',
'https://secure.com',
];
// 先統一轉換為小寫協議
$lowercased = array_map(fn($url) => strtolower($url), $urls);
// 再過濾出以http協議開頭的URL
$httpUrls = array_filter($lowercased, fn($url) => str_starts_with($url, 'http'));
print_r($httpUrls);
?>
array_filter的第二個參數ARRAY_FILTER_USE_KEY可以用來根據鍵名過濾,再結合array_map處理值:
<?php
$data = [
'name' => 'Alice',
'age' => 25,
'email' => '[email protected]',
'score' => 92,
];
// 過濾只保留鍵名為字符串且長度大於3的元素
$filtered = array_filter($data, fn($key) => strlen($key) > 3, ARRAY_FILTER_USE_KEY);
// 將值轉換為字符串格式
$mapped = array_map(fn($value) => (string)$value, $filtered);
print_r($mapped);
?>
先過濾再映射,減少不必要的處理。
先映射再過濾,可以先統一數據格式或結構,方便篩選。
利用箭頭函數和鍊式調用寫出更簡潔代碼。
結合ARRAY_FILTER_USE_KEY實現對鍵名的過濾。
組合使用讓代碼邏輯更清晰,避免複雜循環,提高代碼復用性和可讀性。
掌握這兩個函數的組合使用技巧,能夠讓你在日常PHP開發中處理數組更加得心應手,寫出高效且優雅的代碼。
<?php
// 綜合示例:過濾掉空值,轉換字符串為大寫,返回結果
$data = ['apple', '', 'Banana', null, 'Cherry'];
$result = array_map(
fn($item) => strtoupper($item),
array_filter($data, fn($item) => !empty($item))
);
print_r($result);
?>