當前位置: 首頁> 最新文章列表> array_filter() + array_map() 實現複雜數組轉換與過濾

array_filter() + array_map() 實現複雜數組轉換與過濾

M66 2025-06-04

在PHP 中, array_filter()array_map()是兩個非常強大且常用的數組處理函數。前者用於過濾數組中的元素,後者則用於對數組中的每個元素進行變換。單獨使用它們已經能解決很多問題,但將兩者結合起來使用,能更高效地處理複雜結構的數據,比如嵌套數組、對像數組或是需要多個處理步驟的業務邏輯。

本文將通過一個實際例子,演示如何巧妙地結合array_filter()array_map()來實現複雜數組的過濾與轉換。

一、場景介紹

假設我們有一個用戶數組,每個用戶包含姓名、年齡、郵箱地址、狀態等信息。我們的目標是:

  • 只保留狀態為“active”的用戶;

  • 將每個用戶的姓名轉換為大寫;

  • 只輸出姓名和郵箱兩個字段;

示例原始數組如下:

 $users = [
    ['name' => 'Alice', 'age' => 25, 'email' => 'alice@m66.net', 'status' => 'active'],
    ['name' => 'Bob', 'age' => 30, 'email' => 'bob@m66.net', 'status' => 'inactive'],
    ['name' => 'Charlie', 'age' => 22, 'email' => 'charlie@m66.net', 'status' => 'active'],
];

二、使用array_filter() 進行篩選

我們先用array_filter()過濾出狀態為active 的用戶:

 $activeUsers = array_filter($users, function($user) {
    return $user['status'] === 'active';
});

這一步執行後, $activeUsers只包含Alice 和Charlie。

三、使用array_map() 進行轉換

接下來,我們用array_map()將姓名大寫,並只保留我們關心的字段(name 和email):

 $transformedUsers = array_map(function($user) {
    return [
        'name' => strtoupper($user['name']),
        'email' => $user['email']
    ];
}, $activeUsers);

輸出結果:

 [
    ['name' => 'ALICE', 'email' => 'alice@m66.net'],
    ['name' => 'CHARLIE', 'email' => 'charlie@m66.net']
]

四、鍊式處理的技巧(可選)

如果你希望代碼更簡潔,可以將兩個函數鍊式處理,雖然array_filter()本身不會返回鍵重置的數組,但配合array_values()使用效果更佳:

 $processedUsers = array_map(function($user) {
    return [
        'name' => strtoupper($user['name']),
        'email' => $user['email']
    ];
}, array_values(array_filter($users, function($user) {
    return $user['status'] === 'active';
})));

五、總結

結合array_filter()array_map() ,可以非常靈活地對複雜數組進行處理,做到“先過濾、再轉換”的邏輯分離。這種方式非常適合在處理API 數據返回、表單數據預處理、業務數據流轉等場景中使用。

此外,別忘了,如果你處理的是關聯數組或需要保留鍵名,可以考慮配合array_keys()array_values()或者使用更高級的函數式庫(如Laravel 的Collection 類)來增強可讀性與功能。