当前位置: 首页> 最新文章列表> 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);
?>