PHP array_filter 函数
最后修改于 2025 年 3 月 13 日
PHP 的 array_filter 函数使用回调函数过滤数组的元素。它返回一个包含所有通过回调函数测试的元素的新数组。
基本定义
array_filter 函数会遍历数组的每个元素并将其传递给回调函数。返回 true 的元素将被包含在结果数组中。
语法:array_filter(array $array, ?callable $callback = null, int $mode = 0): array。回调函数可以省略,以过滤掉空值。mode 控制传递给回调函数的参数。
基本的 array_filter 示例
此示例过滤掉数组中的所有奇数,只保留偶数。
basic_array_filter.php
<?php
$numbers = [1, 2, 3, 4, 5, 6];
$evenNumbers = array_filter($numbers, function($n) {
return $n % 2 === 0;
});
print_r($evenNumbers);
回调函数检查每个数字是否为偶数。结果数组仅包含回调函数返回 true 的元素。请注意原始键会被保留。
无回调函数过滤
当未提供回调函数时,array_filter 会从数组中删除所有假值。
no_callback.php
<?php $mixedValues = [0, 1, '', 'hello', null, false, true, [], [1]]; $filtered = array_filter($mixedValues); print_r($filtered);
这将删除 0、空字符串、null、false 和空数组 - 所有假值。过滤后的数组中只剩下真值。
使用 ARRAY_FILTER_USE_BOTH 进行过滤
使用 mode 参数,我们可以将值和键都传递给回调函数。
use_both.php
<?php
$data = [
'user1' => 'admin',
'user2' => 'editor',
'user3' => 'viewer',
'user4' => 'admin'
];
$admins = array_filter($data, function($value, $key) {
return $value === 'admin' && $key !== 'user1';
}, ARRAY_FILTER_USE_BOTH);
print_r($admins);
这会过滤管理员用户,同时排除 user1。回调函数同时接收值和键,从而能够基于两者进行复杂的过滤逻辑。
过滤对象数组
当根据对象属性进行过滤时,array_filter 在对象数组上也能很好地工作。
object_filter.php
<?php
class Product {
public function __construct(
public string $name,
public float $price,
public bool $inStock
) {}
}
$products = [
new Product('Laptop', 999.99, true),
new Product('Phone', 699.99, false),
new Product('Tablet', 399.99, true)
];
$availableProducts = array_filter($products, fn($p) => $p->inStock);
print_r($availableProducts);
这会过滤掉缺货的产品。箭头函数检查 inStock 属性,仅将有货的产品保留在结果中。
使用 ARRAY_FILTER_USE_KEY 进行过滤
当我们只需要根据数组键而不是值进行过滤时。
use_key.php
<?php
$config = [
'db_host' => 'localhost',
'db_user' => 'root',
'db_pass' => 'secret',
'cache_ttl' => 3600,
'debug_mode' => true
];
$dbConfig = array_filter($config, function($key) {
return str_starts_with($key, 'db_');
}, ARRAY_FILTER_USE_KEY);
print_r($dbConfig);
这会将数组过滤为仅包含以 'db_' 开头的键。当在 ARRAY_FILTER_USE_KEY 模式下使用时,回调函数仅接收键。
最佳实践
- 保留键: 请记住,array_filter 默认会保留原始键。
- 类型安全: 为回调函数添加类型提示可以提高代码质量。
- 性能: 对于大型数组,请考虑更有效的方法。
- 可读性: 对于复杂的过滤逻辑,请使用命名函数。
- 重新索引: 如果需要连续的键,请使用 array_values()。
来源
本教程介绍了 PHP 的 array_filter 函数,并通过实际示例展示了其在各种数组过滤场景下的用法。
作者
列出 所有 PHP 数组函数。