當前位置: 首頁> 最新文章列表> array_filter 與array_map 聯合使用的技巧

array_filter 與array_map 聯合使用的技巧

gitbox 2025-05-28

在PHP中, array_filterarray_map是兩個非常常用且強大的數組處理函數。它們單獨使用時各有妙用,但當我們將它們組合起來使用,能夠極大地提升代碼的簡潔性和效率。本文將詳細介紹這兩個函數的用法,並分享它們組合使用的實用技巧和最佳實踐。


1. 認識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);
    

2. 為什麼要組合使用?

  • 過濾後再映射:先用array_filter篩選出符合條件的元素,再用array_map對這些元素進行統一處理。

  • 映射後再過濾:先用array_map轉換數組元素格式,再用array_filter篩選符合要求的結果。

  • 一次鍊式操作:組合使用可以寫出簡潔、直觀的鍊式代碼,避免寫冗長的循環。


3. 實用技巧與示例

技巧一:先過濾後映射,保證映射函數只處理符合條件的元素

<?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);
?>

4. 總結

  • 先過濾再映射,減少不必要的處理。

  • 先映射再過濾,可以先統一數據格式或結構,方便篩選。

  • 利用箭頭函數和鍊式調用寫出更簡潔代碼。

  • 結合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);
?>