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