ZetCode

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 模式下使用时,回调函数仅接收键。

最佳实践

来源

PHP array_filter 文档

本教程介绍了 PHP 的 array_filter 函数,并通过实际示例展示了其在各种数组过滤场景下的用法。

作者

我叫 Jan Bodnar,我是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了超过 1,400 篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出 所有 PHP 数组函数