当前位置: 首页> 最新文章列表> 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 类)来增强可读性与功能。