Menu

PHP array_filter():按值或键过滤数组

array_filter($array, $callback) 保留回调函数返回 true 的元素。学习如何删除空值、用 ARRAY_FILTER_USE_KEY 按键过滤、用 array_values 重新索引结果,以及用 array_reduce 求和。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

array_filter($array, $callback) 返回 $array 中让 $callback 返回 true(或任何能转换为 true 的值)的元素。数组是第一个参数,回调函数是第二个参数,留下来的元素保留原来的键。

结果中的键是 1, 3, 5, 7:也就是这些值在原数组中的位置。这个细节比看上去更重要,后面第二节会讲怎样处理它。

删除数组中的空值

不带回调函数调用 array_filter,它会删除所有能转换为 false 的值:空字符串、null、false、0、"0" 和空数组。这是清理 explode() 结果或表单字段列表最快的方法。

第一个结果把 "0" 和 0 也删掉了,而它们常常是真实数据(数量为零、邮编中的一位数字)。当零是有效值时,就像第二次调用那样自己写回调函数。empty 一页列出了 PHP 视为空的全部值。

用 array_values 重新索引结果

因为键被保留了,过滤后的列表可能出现空缺。从 0 开始的 for 循环会碰到不存在的键,json_encode 也会把结果变成 JSON 对象而不是数组。array_values() 会重新编号。

用 ARRAY_FILTER_USE_KEY 按键过滤

第三个参数决定回调函数收到什么。ARRAY_FILTER_USE_KEY 只传入键。ARRAY_FILTER_USE_BOTH 先传入值,再传入键。

如果要保留的是一组事先已知的键,array_intersect_key($config, array_flip(['db_host', 'db_port'])) 不用回调函数也能做到同样的事。

过滤多维数组

大多数真实数据都是一组行。回调函数每次收到一行,所以你可以检查任何需要的字段。

修改 $maxPrice 再运行一次。之后如果只要名字,就把结果传给 array_column:array_column($affordable, 'name')。

先过滤,再映射,再归约

array_filter 挑选元素,array_map 改变元素,array_reduce 把数组折叠成一个值。array_reduce($array, $callback, $initial) 每次用当前累计值和下一个元素调用回调函数。

如果只是简单求和,array_sum($totals) 更短。当结果是别的东西时,array_reduce 才真正有用:一个字符串、每组的计数、最大的那一行。

常见错误:在 array_filter 里修改值

回调函数的返回值只决定元素是否留下,它计算出的其他东西都会被丢弃,所以下面的代码什么也没有 trim:

先用 array_map 转换,再过滤;需要一个干净的列表时,再加上 array_values。

常见问题

PHP 中怎样删除数组里的空值?

不带回调函数调用 array_filter($array):它会删除所有假值(""、null、false、0、"0"、[])。如果只想删除空字符串和 null、保留 0,就传入一个回调函数:array_filter($array, fn($v) => $v !== '' && $v !== null)。

为什么 array_filter 会保留原来的键?

array_filter 从不重新编号:保留下来的元素仍然在原来的键下,所以一个列表可能变成 [0 => 'a', 2 => 'c']。用 array_values() 包一层就能重新得到 0, 1, 2,这样 json_encode 也会输出 JSON 数组而不是对象。

PHP 中怎样按键过滤数组?

把 ARRAY_FILTER_USE_KEY 作为第三个参数传入,回调函数收到的就是键而不是值:array_filter($arr, fn($k) => str_starts_with($k, 'db_'), ARRAY_FILTER_USE_KEY)。用 ARRAY_FILTER_USE_BOTH 可以同时收到值和键。

array_filter 和 array_map 有什么区别?

array_filter 决定哪些元素留下,并原样返回它们。array_map 改变每一个元素,返回的元素个数不变。两者都要用时,把它们串起来:array_map('strtoupper', array_filter($arr))。

Coddy 编程语言插图

和 Coddy 一起学编程

开始